Merge "Break up $wgDummyLanguageCodes"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 8 Mar 2017 20:46:46 +0000 (20:46 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 8 Mar 2017 20:46:47 +0000 (20:46 +0000)
2239 files changed:
.eslintrc.json
.mailmap
.stylelintrc
.travis.yml
CREDITS
Gemfile
Gemfile.lock
Gruntfile.js
HISTORY
README
RELEASE-NOTES-1.29
api.php
autoload.php
composer.json
docs/contenthandler.txt
docs/extension.schema.v1.json
docs/extension.schema.v2.json
docs/hooks.txt
docs/uidesign/child-selector-emu.html
img_auth.php
includes/AjaxDispatcher.php
includes/Block.php
includes/Category.php
includes/CategoryViewer.php
includes/DefaultSettings.php
includes/Defines.php
includes/DummyLinker.php
includes/EditPage.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/GlobalFunctions.php
includes/HeaderCallback.php [new file with mode: 0644]
includes/HistoryBlob.php
includes/Html.php
includes/LinkFilter.php
includes/Linker.php
includes/MWGrants.php
includes/MWTimestamp.php
includes/MagicWord.php
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/MergeHistory.php
includes/MovePage.php
includes/NoLocalSettings.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/Preferences.php
includes/PrefixSearch.php
includes/ProtectionForm.php
includes/Revision.php
includes/RevisionList.php
includes/Sanitizer.php
includes/Setup.php
includes/SiteStats.php
includes/Title.php
includes/TitleArray.php
includes/TitleArrayFromResult.php
includes/TrackingCategories.php [new file with mode: 0644]
includes/WatchedItemQueryService.php
includes/WatchedItemQueryServiceExtension.php
includes/WatchedItemStore.php
includes/WebRequest.php
includes/WebResponse.php
includes/WebStart.php
includes/Xml.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/RollbackAction.php
includes/api/ApiAuthManagerHelper.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiErrorFormatter.php
includes/api/ApiFeedRecentChanges.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatPhp.php
includes/api/ApiHelp.php
includes/api/ApiImport.php
includes/api/ApiLogin.php
includes/api/ApiMain.php
includes/api/ApiManageTags.php
includes/api/ApiMove.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllRevisions.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBacklinksprop.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryContributors.php
includes/api/ApiQueryDeletedRevisions.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiResult.php
includes/api/ApiSetPageLanguage.php
includes/api/ApiUnblock.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/api/i18n/ar.json
includes/api/i18n/bn.json
includes/api/i18n/br.json
includes/api/i18n/cs.json
includes/api/i18n/de.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/ia.json
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/lb.json
includes/api/i18n/lt.json
includes/api/i18n/mk.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/uk.json
includes/api/i18n/zh-hans.json
includes/api/i18n/zh-hant.json
includes/auth/ThrottlePreAuthenticationProvider.php
includes/cache/BacklinkCache.php
includes/cache/FileCacheBase.php
includes/cache/HTMLFileCache.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/cache/MessageBlobStore.php
includes/cache/MessageCache.php
includes/cache/localisation/LocalisationCache.php
includes/changes/ChangesFeed.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/changes/RecentChange.php
includes/changetags/ChangeTags.php
includes/collation/Collation.php
includes/collation/CollationEt.php
includes/collation/CollationFa.php
includes/collation/IcuCollation.php
includes/compat/Timestamp.php [new file with mode: 0644]
includes/content/ContentHandler.php
includes/content/FileContentHandler.php
includes/content/TextContentHandler.php
includes/content/WikiTextStructure.php
includes/content/WikitextContentHandler.php
includes/context/ContextSource.php
includes/context/RequestContext.php
includes/dao/DBAccessBase.php
includes/db/CloneDatabase.php
includes/db/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/monolog/AvroFormatter.php
includes/debug/logger/monolog/KafkaHandler.php
includes/debug/logger/monolog/LogstashFormatter.php
includes/deferred/DeferredUpdates.php
includes/deferred/LinksUpdate.php
includes/deferred/WANCacheReapUpdate.php [new file with mode: 0644]
includes/diff/DifferenceEngine.php
includes/diff/WordAccumulator.php
includes/exception/ErrorPageError.php
includes/exception/MWContentSerializationException.php
includes/exception/MWException.php
includes/exception/MWExceptionHandler.php
includes/exception/MWUnknownContentModelException.php
includes/exception/PermissionsError.php
includes/exception/UserNotLoggedIn.php
includes/export/WikiExporter.php
includes/export/XmlDumpWriter.php
includes/externalstore/ExternalStoreDB.php
includes/filebackend/filejournal/DBFileJournal.php
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/NullRepo.php
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/fields/HTMLCheckMatrix.php
includes/htmlform/fields/HTMLDateTimeField.php
includes/htmlform/fields/HTMLFormFieldCloner.php
includes/htmlform/fields/HTMLMultiSelectField.php
includes/htmlform/fields/HTMLTextField.php
includes/htmlform/fields/HTMLUsersMultiselectField.php [new file with mode: 0644]
includes/http/Http.php
includes/http/MWHttpRequest.php
includes/import/ImportStreamSource.php
includes/import/WikiImporter.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/MssqlInstaller.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteInstaller.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerName.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/installer/WebInstallerUpgrade.php
includes/installer/i18n/ast.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/bg.json
includes/installer/i18n/bn.json
includes/installer/i18n/br.json
includes/installer/i18n/ca.json
includes/installer/i18n/ckb.json
includes/installer/i18n/cs.json
includes/installer/i18n/de.json
includes/installer/i18n/el.json
includes/installer/i18n/en.json
includes/installer/i18n/es.json
includes/installer/i18n/fa.json
includes/installer/i18n/fi.json
includes/installer/i18n/fr.json
includes/installer/i18n/gl.json
includes/installer/i18n/he.json
includes/installer/i18n/hi.json
includes/installer/i18n/hu.json
includes/installer/i18n/ia.json
includes/installer/i18n/it.json
includes/installer/i18n/ko.json
includes/installer/i18n/lb.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/pl.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/sr-ec.json
includes/installer/i18n/sv.json
includes/installer/i18n/tl.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/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueRedis.php
includes/jobqueue/JobRunner.php
includes/jobqueue/JobSpecification.php
includes/jobqueue/jobs/CategoryMembershipChangeJob.php
includes/jobqueue/jobs/DoubleRedirectJob.php
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/jobqueue/jobs/PublishStashedFileJob.php
includes/jobqueue/jobs/RecentChangesUpdateJob.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/jobqueue/utils/BacklinkJobUtils.php
includes/libs/CSSMin.php
includes/libs/CryptHKDF.php
includes/libs/HttpStatus.php
includes/libs/IP.php
includes/libs/StatusValue.php
includes/libs/StringUtils.php
includes/libs/eventrelayer/EventRelayer.php
includes/libs/filebackend/FSFileBackend.php
includes/libs/filebackend/FileBackendMultiWrite.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/HTTPFileStreamer.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/filebackend/fileop/FileOp.php
includes/libs/mime/MimeAnalyzer.php
includes/libs/mime/mime.info
includes/libs/mime/mime.types
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/RESTBagOStuff.php
includes/libs/objectcache/RedisBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/objectcache/WANObjectCacheReaper.php [new file with mode: 0644]
includes/libs/objectcache/WinCacheBagOStuff.php
includes/libs/rdbms/ChronologyProtector.php
includes/libs/rdbms/TransactionProfiler.php
includes/libs/rdbms/connectionmanager/ConnectionManager.php
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/DatabaseMysqli.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/database/position/DBMasterPos.php
includes/libs/rdbms/database/position/MySQLMasterPos.php
includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php
includes/libs/rdbms/database/resultwrapper/IResultWrapper.php [new file with mode: 0644]
includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php
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/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/time/ConvertibleTimestamp.php [deleted file]
includes/libs/time/TimestampException.php [deleted file]
includes/libs/time/defines.php [deleted file]
includes/libs/virtualrest/VirtualRESTService.php
includes/libs/xmp/XMP.php
includes/libs/xmp/XMPInfo.php
includes/libs/xmp/XMPValidate.php
includes/logging/BlockLogFormatter.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPager.php
includes/logging/RightsLogFormatter.php
includes/mail/EmailNotification.php
includes/mail/UserMailer.php
includes/media/Bitmap.php
includes/media/DjVuImage.php
includes/media/FormatMetadata.php
includes/media/Jpeg.php
includes/media/MediaHandler.php
includes/media/SVGMetadataExtractor.php
includes/media/TransformationalImageHandler.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/ImagePage.php
includes/page/PageArchive.php [new file with mode: 0644]
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/pager/IndexPager.php
includes/pager/ReverseChronologicalPager.php
includes/parser/BlockLevelPass.php
includes/parser/CoreParserFunctions.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/poolcounter/PoolWorkArticleView.php
includes/profiler/Profiler.php
includes/profiler/output/ProfilerOutputDb.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/ExtensionRegistry.php
includes/registration/Processor.php
includes/registration/VersionChecker.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelList.php
includes/revisiondelete/RevDelRevisionList.php
includes/search/SearchEngine.php
includes/search/SearchIndexFieldDefinition.php
includes/search/SqlSearchResultSet.php
includes/session/SessionManager.php
includes/session/SessionManagerInterface.php
includes/session/SessionProvider.php
includes/site/DBSiteStore.php
includes/site/HashSiteStore.php
includes/site/Site.php
includes/skins/BaseTemplate.php
includes/skins/Skin.php
includes/skins/SkinTemplate.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/ImageQueryPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specialpage/PageQueryPage.php
includes/specialpage/QueryPage.php
includes/specialpage/RedirectSpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specialpage/WantedQueryPage.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialChangeContentModel.php
includes/specials/SpecialChangeCredentials.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialExport.php
includes/specials/SpecialImport.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListDuplicatedFiles.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialListredirects.php
includes/specials/SpecialLog.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialMostcategories.php
includes/specials/SpecialMostinterwikis.php
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialPageLanguage.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialSearch.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialStatistics.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/SpecialUploadStash.php
includes/specials/SpecialUserLogout.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedfiles.php
includes/specials/SpecialWantedpages.php
includes/specials/SpecialWatchlist.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/ProtectedPagesPager.php [new file with mode: 0644]
includes/specials/pagers/UsersPager.php
includes/tidy/Balancer.php
includes/tidy/RemexCompatFormatter.php [new file with mode: 0644]
includes/tidy/RemexCompatMunger.php [new file with mode: 0644]
includes/tidy/RemexDriver.php [new file with mode: 0644]
includes/tidy/RemexMungerData.php [new file with mode: 0644]
includes/tidy/TidyDriverBase.php
includes/title/MediaWikiTitleCodec.php
includes/title/NamespaceAwareForeignTitleFactory.php
includes/upload/UploadBase.php
includes/user/PasswordReset.php
includes/user/User.php
includes/user/UserArray.php
includes/user/UserArrayFromResult.php
includes/user/UserGroupMembership.php [new file with mode: 0644]
includes/user/UserRightsProxy.php
includes/utils/AutoloadGenerator.php
includes/utils/BatchRowIterator.php
includes/utils/MWCryptHKDF.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]
languages/Language.php
languages/LanguageConverter.php
languages/classes/LanguageAr.php
languages/classes/LanguageFi.php
languages/classes/LanguageKsh.php
languages/classes/LanguageLa.php
languages/classes/LanguageMl.php
languages/classes/LanguageTr.php
languages/data/Names.php
languages/data/ZhConversion.php
languages/data/grammarTransformations/he.json
languages/i18n/ace.json
languages/i18n/aeb-arab.json
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/arn.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/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/cu.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/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/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/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/km.json
languages/i18n/ko.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/lv.json
languages/i18n/mai.json
languages/i18n/mg.json
languages/i18n/mhr.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/rue.json
languages/i18n/sa.json
languages/i18n/sah.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/tyv.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/xmf.json
languages/i18n/yi.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesAb.php
languages/messages/MessagesAce.php
languages/messages/MessagesAf.php
languages/messages/MessagesAk.php
languages/messages/MessagesAln.php
languages/messages/MessagesAm.php
languages/messages/MessagesAn.php
languages/messages/MessagesAng.php
languages/messages/MessagesAnp.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesArn.php
languages/messages/MessagesArq.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAvk.php
languages/messages/MessagesAy.php
languages/messages/MessagesAz.php
languages/messages/MessagesAzb.php
languages/messages/MessagesBa.php
languages/messages/MessagesBan.php
languages/messages/MessagesBar.php
languages/messages/MessagesBbc_latn.php
languages/messages/MessagesBcc.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBh.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBm.php
languages/messages/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/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/MessagesPnb.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/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/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/addSite.php [new file with mode: 0755]
maintenance/archives/patch-archive-ar_id.sql
maintenance/archives/patch-categorylinks-better-collation.sql
maintenance/archives/patch-externallinks-el_id.sql
maintenance/archives/patch-up_property.sql
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/benchmarks/bench_utf8_title_check.php
maintenance/cleanupImages.php
maintenance/cleanupRemovedModules.php
maintenance/cleanupTitles.php
maintenance/convertUserOptions.php
maintenance/dumpTextPass.php
maintenance/findHooks.php
maintenance/fixDoubleRedirects.php
maintenance/generateJsonI18n.php
maintenance/generateSitemap.php
maintenance/hhvm/makeRepo.php
maintenance/importImages.php
maintenance/initUserPreference.php [new file with mode: 0644]
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/migrateUserGroup.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-user_groups-ug_expiry.sql [new file with mode: 0644]
maintenance/oracle/tables.sql
maintenance/populateRevisionLength.php
maintenance/populateRevisionSha1.php
maintenance/postgres/tables.sql
maintenance/purgeChangedPages.php
maintenance/purgeModuleDeps.php [new file with mode: 0644]
maintenance/rebuildFileCache.php
maintenance/rebuildtextindex.php
maintenance/refreshLinks.php
maintenance/shell.php [new file with mode: 0644]
maintenance/sql.php
maintenance/sqlite/archives/initial-indexes.sql
maintenance/sqlite/archives/patch-user_groups-ug_expiry.sql [new file with mode: 0644]
maintenance/storage/fixBug20757.php [deleted file]
maintenance/storage/fixT22757.php [new file with mode: 0644]
maintenance/storage/trackBlobs.php
maintenance/tables.sql
maintenance/update.php
maintenance/userDupes.inc
maintenance/wrapOldPasswords.php
mw-config/config-cc.css
mw-config/config.css
package.json
resources/Resources.php
resources/lib/jquery.ui/jquery.ui.draggable.js
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/bqi.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/br.json
resources/lib/oojs-ui/i18n/fr.json
resources/lib/oojs-ui/i18n/io.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/mg.json
resources/lib/oojs-ui/i18n/nn.json
resources/lib/oojs-ui/i18n/pnb.json
resources/lib/oojs-ui/i18n/sr-ec.json
resources/lib/oojs-ui/i18n/yi.json
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-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-content.json
resources/lib/oojs-ui/themes/apex/icons-editing-advanced.json
resources/lib/oojs-ui/themes/apex/icons-editing-styling.json
resources/lib/oojs-ui/themes/apex/icons-interactions.json
resources/lib/oojs-ui/themes/apex/icons-moderation.json
resources/lib/oojs-ui/themes/apex/icons.json
resources/lib/oojs-ui/themes/apex/images/icons/add-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/add-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg
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/case-sensitive.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/close.svg
resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/diacritic.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/eye.png
resources/lib/oojs-ui/themes/apex/images/icons/eye.svg
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.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/highlight-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.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.svg
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/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/subtract-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/subtract.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/subtract.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.svg
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-editing-advanced.json
resources/lib/oojs-ui/themes/mediawiki/icons-editing-styling.json
resources/lib/oojs-ui/themes/mediawiki/icons-interactions.json
resources/lib/oojs-ui/themes/mediawiki/icons-moderation.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/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.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/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.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/case-sensitive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.svg
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-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/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/diacritic-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/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/feedback-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/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/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/highlight-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/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.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/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.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.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.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.svg
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.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-progressive.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/subtract-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/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.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.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/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.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.svg
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.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.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.svg
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/src/dom-level2-skip.js [deleted file]
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.farbtastic.css
resources/src/jquery/jquery.highlightText.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.tablesorter.less
resources/src/jquery/jquery.textSelection.js
resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js
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.css
resources/src/mediawiki.action/mediawiki.action.view.categoryPage.less
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.redirectPage.css
resources/src/mediawiki.action/mediawiki.action.view.rightClickEdit.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.mixins.rotation.less
resources/src/mediawiki.less/mediawiki.ui/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
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
resources/src/mediawiki.rcfilters/images/pending.gif [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
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
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterGroupWidget.less
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
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FiltersListWidget.less
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
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterGroupWidget.js
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
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FiltersListWidget.js
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.block.css
resources/src/mediawiki.special/mediawiki.special.comparepages.styles.less
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki.special/mediawiki.special.preferences.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.toolbar/toolbar.less
resources/src/mediawiki.ui/components/anchors.less
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/forms.less
resources/src/mediawiki.ui/components/icons.less
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki.ui/components/radio.less
resources/src/mediawiki.ui/components/text.less
resources/src/mediawiki.ui/default.less
resources/src/mediawiki.widgets.datetime/CalendarWidget.less
resources/src/mediawiki.widgets.datetime/DateTimeInputWidget.less
resources/src/mediawiki.widgets.datetime/mediawiki.widgets.datetime.definitions.less
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.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/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.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.filewarning.less
resources/src/mediawiki/mediawiki.helplink.less
resources/src/mediawiki/mediawiki.hlist.css
resources/src/mediawiki/mediawiki.icon.less
resources/src/mediawiki/mediawiki.inspect.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.notification.js
resources/src/mediawiki/mediawiki.pager.tablePager.less
resources/src/mediawiki/mediawiki.requestIdleCallback.js
resources/src/mediawiki/mediawiki.storage.js
resources/src/mediawiki/mediawiki.user.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/watch.js
resources/src/moment-dmy.js
resources/src/moment-locale-overrides.js
resources/src/oojs-ui-local.js
resources/src/polyfill-nodeTypes.js [deleted file]
resources/src/startup.js
tests/browser/features/login.feature
tests/browser/features/step_definitions/login_steps.rb
tests/browser/features/step_definitions/preferences_appearance_steps.rb
tests/browser/features/step_definitions/preferences_editing_steps.rb
tests/browser/features/step_definitions/preferences_user_profile_steps.rb
tests/browser/features/support/pages/create_account_page.rb
tests/browser/features/support/pages/login_page.rb
tests/common/TestSetup.php
tests/integration/includes/http/MWHttpRequestTestCase.php
tests/parser/DbTestPreviewer.php
tests/parser/DbTestRecorder.php
tests/parser/DjVuSupport.php
tests/parser/ParserTestPrinter.php
tests/parser/ParserTestResultNormalizer.php
tests/parser/ParserTestRunner.php
tests/parser/README
tests/parser/TestFileEditor.php
tests/parser/TestFileReader.php
tests/parser/TestRecorder.php
tests/parser/TidySupport.php
tests/parser/extraParserTests.txt
tests/parser/parserTests.txt
tests/phan/bin/phan
tests/phan/config.php
tests/phan/stubs/hhvm.php
tests/phan/stubs/mail.php
tests/phan/stubs/memcached.php [new file with mode: 0644]
tests/phan/stubs/tideways.php [new file with mode: 0644]
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/autoload.ide.php [new file with mode: 0644]
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/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/HtmlTest.php
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/TitleTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiErrorFormatterTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiOpenSearchTest.php
tests/phpunit/includes/api/ApiQueryAllPagesTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/query/ApiQueryBasicTest.php
tests/phpunit/includes/auth/ThrottlePreAuthenticationProviderTest.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/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/DeferredUpdatesTest.php
tests/phpunit/includes/deferred/SearchUpdateTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filebackend/SwiftFileBackendTest.php
tests/phpunit/includes/filerepo/StoreBatchTest.php
tests/phpunit/includes/http/HttpTest.php
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
tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseDomainTest.php
tests/phpunit/includes/libs/time/ConvertibleTimestampTest.php [deleted file]
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/objectcache/RESTBagOStuffTest.php
tests/phpunit/includes/page/ArticleTablesTest.php
tests/phpunit/includes/page/WikiPageTest.php
tests/phpunit/includes/pager/ReverseChronologicalPagerTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/ParserPreloadTest.php
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/parser/TagHooksTest.php
tests/phpunit/includes/password/UserPasswordPolicyTest.php
tests/phpunit/includes/rcfeed/RCFeedIntegrationTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/search/SearchEnginePrefixTest.php
tests/phpunit/includes/search/SearchIndexFieldTest.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/SpecialBooksourcesTest.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/RemexDriverTest.php [new file with mode: 0644]
tests/phpunit/includes/tidy/html5lib-tests.json
tests/phpunit/includes/title/NamespaceAwareForeignTitleFactoryTest.php
tests/phpunit/includes/upload/UploadBaseTest.php
tests/phpunit/includes/upload/UploadStashTest.php
tests/phpunit/includes/user/UserGroupMembershipTest.php [new file with mode: 0644]
tests/phpunit/includes/user/UserTest.php
tests/phpunit/includes/utils/ClassCollectorTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/UIDGeneratorTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/classes/LanguageBe_taraskTest.php
tests/phpunit/languages/classes/LanguageMlTest.php
tests/phpunit/languages/classes/LanguageTrTest.php
tests/phpunit/maintenance/backupPrefetchTest.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/suite.xml
tests/phpunit/suites/CoreParserTestSuite.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.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.rcfilters/dm.FilterItem.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js
tests/qunit/suites/resources/mediawiki.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.inspect.test.js [new file with mode: 0644]
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.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.user.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 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..27e289d 100644 (file)
@@ -1,26 +1,8 @@
 {
+       "extends": "stylelint-config-wikimedia",
        "rules": {
-               "color-hex-case": [ "lower" ],
-               "color-hex-length": [ "short" ],
-               "color-named": [ "never" ],
-               "color-no-invalid-hex": true,
+               "no-descending-specificity": null,
 
-               "declaration-bang-space-after": [ "never" ],
-               "declaration-bang-space-before": [ "always" ],
-               "declaration-colon-space-after": [ "always" ],
-               "declaration-colon-space-before": [ "never" ],
-
-               "font-family-name-quotes": [ "always-unless-keyword" ],
-               "font-weight-notation": [ "named-where-possible" ],
-
-               "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" ],
+               "selector-no-id": 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..e8af23c 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 -->
@@ -170,6 +169,7 @@ following names for their contribution to the product.
 * Ed Sanders
 * Edward Chernenko
 * Edward Z. Yang
+* Eddie Greiner-Petter
 * Elisabeth Bauer
 * Elliott Eggleston
 * Elvis Stansvik
diff --git a/Gemfile b/Gemfile
index 8bbd00f..ee0cec0 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,5 +1,5 @@
 source 'https://rubygems.org'
 
-gem 'mediawiki_selenium', '~> 1.7', '>= 1.7.4'
+gem 'mediawiki_selenium', '~> 1.8'
 gem 'rake', '~> 11.1', '>= 11.1.1'
 gem 'rubocop', '~> 0.32.1', require: false
index 8243874..4992303 100644 (file)
@@ -4,8 +4,8 @@ GEM
     ast (2.0.0)
     astrolabe (1.3.0)
       parser (>= 2.2.0.pre.3, < 3.0)
-    builder (3.2.2)
-    childprocess (0.5.9)
+    builder (3.2.3)
+    childprocess (0.6.2)
       ffi (~> 1.0, >= 1.0.11)
     cucumber (1.3.20)
       builder (>= 2.1.2)
@@ -16,40 +16,40 @@ GEM
     data_magic (1.0)
       faker (>= 1.1.2)
       yml_reader (>= 0.6)
-    diff-lcs (1.2.5)
-    domain_name (0.5.20161129)
+    diff-lcs (1.3)
+    domain_name (0.5.20170223)
       unf (>= 0.0.5, < 1.0.0)
-    faker (1.7.1)
+    faker (1.7.3)
       i18n (~> 0.5)
-    faraday (0.10.0)
+    faraday (0.11.0)
       multipart-post (>= 1.2, < 3)
     faraday-cookie_jar (0.0.6)
       faraday (>= 0.7.4)
       http-cookie (~> 1.0.0)
-    faraday_middleware (0.10.1)
+    faraday_middleware (0.11.0.1)
       faraday (>= 0.7.4, < 1.0)
-    ffi (1.9.14)
+    ffi (1.9.17)
     gherkin (2.12.2)
       multi_json (~> 1.3)
     headless (2.3.1)
     http-cookie (1.0.3)
       domain_name (~> 0.5)
-    i18n (0.7.0)
-    json (2.0.2)
-    mediawiki_api (0.7.0)
+    i18n (0.8.1)
+    json (2.0.3)
+    mediawiki_api (0.7.1)
       faraday (~> 0.9, >= 0.9.0)
       faraday-cookie_jar (~> 0.0, >= 0.0.6)
       faraday_middleware (~> 0.10, >= 0.10.0)
-    mediawiki_selenium (1.7.4)
+    mediawiki_selenium (1.8.0)
       cucumber (~> 1.3, >= 1.3.20)
       headless (~> 2.0, >= 2.1.0)
       json (~> 2.0, >= 2.0.2)
       mediawiki_api (~> 0.7, >= 0.7.0)
-      page-object (~> 1.0)
+      page-object (~> 2.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)
+      selenium-webdriver (~> 3.1.0)
       syntax (~> 1.2, >= 1.2.0)
       thor (~> 0.19, >= 0.19.1)
     mime-types (2.99.3)
@@ -58,11 +58,11 @@ GEM
     multipart-post (2.0.0)
     net-http-persistent (2.9.4)
     netrc (0.11.0)
-    page-object (1.2.2)
+    page-object (2.0.0)
       net-http-persistent (~> 2.9.4)
       page_navigation (>= 0.9)
-      selenium-webdriver (>= 2.53.0)
-      watir-webdriver (>= 0.6.11, < 0.9.9)
+      selenium-webdriver (~> 3.0)
+      watir (~> 6.0)
     page_navigation (0.10)
       data_magic (>= 0.22)
     parser (2.2.2.6)
@@ -84,8 +84,8 @@ GEM
       rainbow (>= 1.99.1, < 3.0)
       ruby-progressbar (~> 1.4)
     ruby-progressbar (1.7.5)
-    rubyzip (1.2.0)
-    selenium-webdriver (2.53.4)
+    rubyzip (1.2.1)
+    selenium-webdriver (3.1.0)
       childprocess (~> 0.5)
       rubyzip (~> 1.0)
       websocket (~> 1.0)
@@ -94,18 +94,18 @@ GEM
     unf (0.1.4)
       unf_ext
     unf_ext (0.0.7.2)
-    watir-webdriver (0.9.3)
-      selenium-webdriver (>= 2.46.2)
-    websocket (1.2.3)
+    watir (6.2.0)
+      selenium-webdriver (~> 3.0)
+    websocket (1.2.4)
     yml_reader (0.7)
 
 PLATFORMS
   ruby
 
 DEPENDENCIES
-  mediawiki_selenium (~> 1.7, >= 1.7.4)
+  mediawiki_selenium (~> 1.8)
   rake (~> 11.1, >= 11.1.1)
   rubocop (~> 0.32.1)
 
 BUNDLED WITH
-   1.13.7
+   1.14.5
index 7b3af54..0e1c8cb 100644 (file)
@@ -24,12 +24,13 @@ module.exports = function ( grunt ) {
                        all: [
                                '**/*.js',
                                '!docs/**',
-                               '!tests/**',
                                '!node_modules/**',
                                '!resources/lib/**',
                                '!resources/src/jquery.tipsy/**',
                                '!resources/src/jquery/jquery.farbtastic.js',
                                '!resources/src/mediawiki.libs/**',
+                               // Third-party code of PHPUnit coverage report
+                               '!tests/coverage/**',
                                '!vendor/**',
                                // Explicitly say "**/*.js" here in case of symlinks
                                '!extensions/**/*.js',
@@ -58,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: [
@@ -88,6 +89,9 @@ module.exports = function ( grunt ) {
                        main: {
                                browsers: [ 'Chrome' ]
                        },
+                       chromium: {
+                               browsers: [ 'Chromium' ]
+                       },
                        more: {
                                browsers: [ 'Chrome', 'Firefox' ]
                        }
diff --git a/HISTORY b/HISTORY
index 28a9b86..7f365ac 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -326,6 +326,27 @@ 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 ===
@@ -652,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 ===
 
@@ -909,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.
@@ -1187,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.
@@ -2573,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?
index b886738..5bc66fd 100644 (file)
@@ -6,8 +6,8 @@ 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,
@@ -22,15 +22,21 @@ production.
   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.
+* $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
@@ -39,11 +45,25 @@ production.
   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 ====
+* Added wikimedia/timestamp v1.0.0.
 * 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.
+* Updated oyejorge/less.php from v1.7.0.10 to v1.7.0.13.
 
 ==== New external libraries ====
 
@@ -52,12 +72,15 @@ production.
 === 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
@@ -83,6 +106,9 @@ production.
   no longer returns a 'message' on success.
 * Added action=validatepassword to validate passwords for the account creation
   and password change forms.
+* action=purge now requires a POST.
+* There is a new `languagevariants` siprop for action=query&meta=siteinfo,
+  which returns a list of languages with active LanguageConverter instances.
 
 === Action API internal changes in 1.29 ===
 * New methods were added to ApiBase to handle errors and warnings using i18n
@@ -121,7 +147,9 @@ changes to languages because of Phabricator reports.
   Some configurations (such as date formats and gender namespaces) have also
   been updated when using the fallback language's configuration was inadequate.
   The new or reinstated language fallbacks are (after cs ↔ sk in 1.28):
-  hsb ↔ dsb, io → eo, mdf → ru, pnt → el, roa-tara → it.
+  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
@@ -139,10 +167,11 @@ changes to languages because of Phabricator reports.
 * Xml::escapeJsString() (deprecated in 1.21) was removed.
 * Article::getText() and Article::prepareTextForEdit() (deprecated in 1.21)
   were removed.
-* Article::getAutosummary() and WikiPage::getAutosummary (deprecated in 1.21)
-  were removed.
-* Hooks ArticleViewCustom, EditPageGetDiffText and ShowRawCssJs (deprecated in 1.21)
+* Article::getAutosummary() and WikiPage::getAutosummary() (deprecated in 1.21)
   were removed.
+* Hook ArticleViewCustom (deprecated in 1.21) was removed. Use ArticleContentViewCustom
+  instead.
+* Hooks EditPageGetDiffText and ShowRawCssJs (deprecated in 1.21) were removed.
 * Class RevisiondeleteAction (deprecated in 1.25) was removed.
 * WikiPage::prepareTextForEdit() (deprecated in 1.21) was removed.
 * WikiPage::getText() (deprecated in 1.21) was removed.
@@ -150,15 +179,72 @@ changes to languages because of Phabricator reports.
 * User::getPassword() (deprecated in 1.27) was removed.
 * User::getTemporaryPassword() (deprecated in 1.27) was removed.
 * User::isPasswordReminderThrottled() (deprecated in 1.27) was removed.
-* FSRepo (deprecated in 1.19) 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.
+  \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.
+* 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 ==
 
diff --git a/api.php b/api.php
index 6e75fb7..a6ce3b2 100644 (file)
--- a/api.php
+++ b/api.php
@@ -63,7 +63,7 @@ RequestContext::getMain()->setTitle( $wgTitle );
 try {
        /* Construct an ApiMain with the arguments passed via the URL. What we get back
         * is some form of an ApiMain, possibly even one that produces an error message,
-        * but we don't care here, as that is handled by the ctor.
+        * but we don't care here, as that is handled by the constructor.
         */
        $processor = new ApiMain( RequestContext::getMain(), $wgEnableWriteAPI );
 
index e035828..0f79323 100644 (file)
@@ -11,6 +11,7 @@ $wgAutoloadLocalClasses = [
        'ActiveUsersPager' => __DIR__ . '/includes/specials/pagers/ActiveUsersPager.php',
        'ActivityUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/ActivityUpdateJob.php',
        'AddRFCAndPMIDInterwiki' => __DIR__ . '/maintenance/addRFCandPMIDInterwiki.php',
+       'AddSite' => __DIR__ . '/maintenance/addSite.php',
        'AjaxDispatcher' => __DIR__ . '/includes/AjaxDispatcher.php',
        'AjaxResponse' => __DIR__ . '/includes/AjaxResponse.php',
        'AllMessagesTablePager' => __DIR__ . '/includes/specials/pagers/AllMessagesTablePager.php',
@@ -247,7 +248,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',
@@ -258,6 +258,7 @@ $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',
@@ -288,7 +289,6 @@ $wgAutoloadLocalClasses = [
        'ConvertLinks' => __DIR__ . '/maintenance/convertLinks.php',
        'ConvertUserOptions' => __DIR__ . '/maintenance/convertUserOptions.php',
        'ConverterRule' => __DIR__ . '/languages/ConverterRule.php',
-       'ConvertibleTimestamp' => __DIR__ . '/includes/libs/time/ConvertibleTimestamp.php',
        'Cookie' => __DIR__ . '/includes/libs/Cookie.php',
        'CookieJar' => __DIR__ . '/includes/libs/CookieJar.php',
        'CopyFileBackend' => __DIR__ . '/maintenance/copyFileBackend.php',
@@ -314,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',
@@ -325,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',
@@ -488,10 +486,10 @@ $wgAutoloadLocalClasses = [
        'FindHooks' => __DIR__ . '/maintenance/findHooks.php',
        'FindMissingFiles' => __DIR__ . '/maintenance/findMissingFiles.php',
        'FindOrphanedFiles' => __DIR__ . '/maintenance/findOrphanedFiles.php',
-       'FixBug20757' => __DIR__ . '/maintenance/storage/fixBug20757.php',
        'FixDefaultJsonContentPages' => __DIR__ . '/maintenance/fixDefaultJsonContentPages.php',
        'FixDoubleRedirects' => __DIR__ . '/maintenance/fixDoubleRedirects.php',
        'FixExtLinksProtocolRelative' => __DIR__ . '/maintenance/fixExtLinksProtocolRelative.php',
+       'FixT22757' => __DIR__ . '/maintenance/storage/fixT22757.php',
        'FixTimestamps' => __DIR__ . '/maintenance/fixTimestamps.php',
        'FixUserRegistration' => __DIR__ . '/maintenance/fixUserRegistration.php',
        'ForeignAPIFile' => __DIR__ . '/includes/filerepo/file/ForeignAPIFile.php',
@@ -507,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',
@@ -568,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',
@@ -596,9 +596,6 @@ $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',
@@ -631,6 +628,7 @@ $wgAutoloadLocalClasses = [
        'InfoAction' => __DIR__ . '/includes/actions/InfoAction.php',
        'InitEditCount' => __DIR__ . '/maintenance/initEditCount.php',
        'InitSiteStats' => __DIR__ . '/maintenance/initSiteStats.php',
+       'InitUserPreference' => __DIR__ . '/maintenance/initUserPreference.php',
        'InstallDocFormatter' => __DIR__ . '/includes/installer/InstallDocFormatter.php',
        'Installer' => __DIR__ . '/includes/installer/Installer.php',
        'InstallerOverrides' => __DIR__ . '/includes/installer/InstallerOverrides.php',
@@ -672,10 +670,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',
@@ -733,7 +727,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',
@@ -748,9 +741,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',
@@ -811,6 +801,7 @@ $wgAutoloadLocalClasses = [
        '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',
@@ -824,6 +815,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',
@@ -864,6 +856,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Auth\\UsernameAuthenticationRequest' => __DIR__ . '/includes/auth/UsernameAuthenticationRequest.php',
        'MediaWiki\\Diff\\ComplexityException' => __DIR__ . '/includes/diff/ComplexityException.php',
        'MediaWiki\\Diff\\WordAccumulator' => __DIR__ . '/includes/diff/WordAccumulator.php',
+       'MediaWiki\\HeaderCallback' => __DIR__ . '/includes/HeaderCallback.php',
        'MediaWiki\\Interwiki\\ClassicInterwikiLookup' => __DIR__ . '/includes/interwiki/ClassicInterwikiLookup.php',
        'MediaWiki\\Interwiki\\InterwikiLookup' => __DIR__ . '/includes/interwiki/InterwikiLookup.php',
        'MediaWiki\\Interwiki\\InterwikiLookupAdapter' => __DIR__ . '/includes/interwiki/InterwikiLookupAdapter.php',
@@ -926,6 +919,10 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Tidy\\RaggettInternalHHVM' => __DIR__ . '/includes/tidy/RaggettInternalHHVM.php',
        'MediaWiki\\Tidy\\RaggettInternalPHP' => __DIR__ . '/includes/tidy/RaggettInternalPHP.php',
        'MediaWiki\\Tidy\\RaggettWrapper' => __DIR__ . '/includes/tidy/RaggettWrapper.php',
+       'MediaWiki\\Tidy\\RemexCompatFormatter' => __DIR__ . '/includes/tidy/RemexCompatFormatter.php',
+       'MediaWiki\\Tidy\\RemexCompatMunger' => __DIR__ . '/includes/tidy/RemexCompatMunger.php',
+       'MediaWiki\\Tidy\\RemexDriver' => __DIR__ . '/includes/tidy/RemexDriver.php',
+       'MediaWiki\\Tidy\\RemexMungerData' => __DIR__ . '/includes/tidy/RemexMungerData.php',
        'MediaWiki\\Tidy\\TidyDriverBase' => __DIR__ . '/includes/tidy/TidyDriverBase.php',
        'MediaWiki\\Widget\\ComplexNamespaceInputWidget' => __DIR__ . '/includes/widget/ComplexNamespaceInputWidget.php',
        'MediaWiki\\Widget\\ComplexTitleInputWidget' => __DIR__ . '/includes/widget/ComplexTitleInputWidget.php',
@@ -933,8 +930,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',
@@ -970,10 +978,7 @@ $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',
        'MultiConfig' => __DIR__ . '/includes/config/MultiConfig.php',
        'MultiHttpClient' => __DIR__ . '/includes/libs/MultiHttpClient.php',
@@ -981,8 +986,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',
@@ -1007,8 +1010,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',
@@ -1047,7 +1050,7 @@ $wgAutoloadLocalClasses = [
        'PackedImageGallery' => __DIR__ . '/includes/gallery/PackedImageGallery.php',
        'PackedOverlayImageGallery' => __DIR__ . '/includes/gallery/PackedOverlayImageGallery.php',
        'Page' => __DIR__ . '/includes/page/Page.php',
-       'PageArchive' => __DIR__ . '/includes/specials/SpecialUndelete.php',
+       'PageArchive' => __DIR__ . '/includes/page/PageArchive.php',
        'PageExists' => __DIR__ . '/maintenance/pageExists.php',
        'PageLangLogFormatter' => __DIR__ . '/includes/logging/PageLangLogFormatter.php',
        'PageProps' => __DIR__ . '/includes/PageProps.php',
@@ -1095,8 +1098,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',
@@ -1121,7 +1122,7 @@ $wgAutoloadLocalClasses = [
        'Protect' => __DIR__ . '/maintenance/protect.php',
        'ProtectAction' => __DIR__ . '/includes/actions/ProtectAction.php',
        'ProtectLogFormatter' => __DIR__ . '/includes/logging/ProtectLogFormatter.php',
-       'ProtectedPagesPager' => __DIR__ . '/includes/specials/SpecialProtectedpages.php',
+       'ProtectedPagesPager' => __DIR__ . '/includes/specials/pagers/ProtectedPagesPager.php',
        'ProtectedTitlesPager' => __DIR__ . '/includes/specials/pagers/ProtectedTitlesPager.php',
        'ProtectionForm' => __DIR__ . '/includes/ProtectionForm.php',
        'ProxyLookup' => __DIR__ . '/includes/ProxyLookup.php',
@@ -1132,6 +1133,7 @@ $wgAutoloadLocalClasses = [
        'PurgeChangedPages' => __DIR__ . '/maintenance/purgeChangedPages.php',
        'PurgeJobUtils' => __DIR__ . '/includes/jobqueue/utils/PurgeJobUtils.php',
        'PurgeList' => __DIR__ . '/maintenance/purgeList.php',
+       'PurgeModuleDeps' => __DIR__ . '/maintenance/purgeModuleDeps.php',
        'PurgeOldText' => __DIR__ . '/maintenance/purgeOldText.php',
        'PurgeParserCache' => __DIR__ . '/maintenance/purgeParserCache.php',
        'QueryPage' => __DIR__ . '/includes/specialpage/QueryPage.php',
@@ -1140,6 +1142,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',
@@ -1245,7 +1248,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',
@@ -1441,7 +1443,6 @@ $wgAutoloadLocalClasses = [
        'ThumbnailRenderJob' => __DIR__ . '/includes/jobqueue/jobs/ThumbnailRenderJob.php',
        'TidyUpBug37714' => __DIR__ . '/maintenance/tidyUpBug37714.php',
        'TiffHandler' => __DIR__ . '/includes/media/Tiff.php',
-       'TimestampException' => __DIR__ . '/includes/libs/time/TimestampException.php',
        'Timing' => __DIR__ . '/includes/libs/Timing.php',
        'Title' => __DIR__ . '/includes/Title.php',
        'TitleArray' => __DIR__ . '/includes/TitleArray.php',
@@ -1452,8 +1453,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',
@@ -1516,6 +1517,7 @@ $wgAutoloadLocalClasses = [
        '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',
@@ -1533,7 +1535,9 @@ $wgAutoloadLocalClasses = [
        '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',
@@ -1578,8 +1582,39 @@ $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\\FakeResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php',
+       'Wikimedia\\Rdbms\\Field' => __DIR__ . '/includes/libs/rdbms/field/Field.php',
+       'Wikimedia\\Rdbms\\IBlob' => __DIR__ . '/includes/libs/rdbms/encasing/IBlob.php',
+       'Wikimedia\\Rdbms\\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\\MssqlResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php',
+       'Wikimedia\\Rdbms\\MySQLField' => __DIR__ . '/includes/libs/rdbms/field/MySQLField.php',
+       'Wikimedia\\Rdbms\\MySQLMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/MySQLMasterPos.php',
+       'Wikimedia\\Rdbms\\PostgresBlob' => __DIR__ . '/includes/libs/rdbms/encasing/PostgresBlob.php',
+       'Wikimedia\\Rdbms\\PostgresField' => __DIR__ . '/includes/libs/rdbms/field/PostgresField.php',
+       'Wikimedia\\Rdbms\\ResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/ResultWrapper.php',
+       'Wikimedia\\Rdbms\\SQLiteField' => __DIR__ . '/includes/libs/rdbms/field/SQLiteField.php',
        'Wikimedia\\Rdbms\\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 e103d9c..ce38914 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.3",
-               "oyejorge/less.php": "1.7.0.10",
+               "oojs/oojs-ui": "0.19.5",
+               "oyejorge/less.php": "1.7.0.13",
                "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",
                "wikimedia/ip-set": "1.1.0",
                "wikimedia/php-session-serializer": "1.0.4",
                "wikimedia/relpath": "1.0.3",
+               "wikimedia/remex-html": "1.0.0",
                "wikimedia/running-stat": "1.1.0",
                "wikimedia/scoped-callback": "1.0.0",
                "wikimedia/utfnormal": "1.1.0",
+               "wikimedia/timestamp": "1.0.0",
                "wikimedia/wait-condition-loop": "1.0.1",
                "wikimedia/wrappedstring": "2.2.0",
                "zordius/lightncandy": "0.23"
                "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.31",
-               "wikimedia/avro": "1.7.7"
+               "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",
        "autoload": {
                "psr-0": {
                        "ComposerHookHandler": "includes/composer"
-               }
+               },
+               "files": [
+                       "includes/compat/Timestamp.php"
+               ]
+       },
+       "autoload-dev": {
+               "files": [
+                       "vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php",
+                       "vendor/wmde/hamcrest-html-matchers/src/functions.php"
+               ]
        },
        "scripts": {
                "lint": "parallel-lint --exclude vendor",
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
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."
                                }
                        }
                },
index a5543d1..a2fdf65 100644 (file)
@@ -56,6 +56,7 @@
                "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": {
                                                        "type": ["string", "array"],
                                                        "description": "A description of the config setting, mostly for documentation/developers"
+                                               },
+                                               "decriptionmsg": {
+                                                       "type": "string",
+                                                       "description": "The message key which should be used as a description for this configuration option in a user interface. If empty, description will be used."
+                                               },
+                                               "public": {
+                                                       "type": "boolean",
+                                                       "default": false,
+                                                       "description": "Whether this configuration option and its value is allowed to be revealed in public or not."
                                                }
                                        }
                                }
index 2f99fff..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 ] );
                        }
                }
        }
@@ -365,6 +369,11 @@ $user: Current user
  * 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
 processing request parameters. Return false to let the request fail, returning
@@ -603,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
@@ -677,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)
@@ -740,31 +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
-$undidRevId: the rev ID (or 0) this edit undid
-
 '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
@@ -1126,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.
 
@@ -1334,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
@@ -1448,13 +1410,6 @@ types using the ContentHandler facility.
 $editPage: EditPage object
 &$content: Content object to be previewed (may be replaced by hook function)
 
-'EditPageGetPreviewText': DEPRECATED! Use EditPageGetPreviewContent instead.
-Allow modifying the wikitext that will be previewed. Note that it is preferable
-to implement previews for different data types using the ContentHandler
-facility.
-$editPage: EditPage object
-&$toparse: wikitext that will be parsed
-
 'EditPageNoSuchSection': When a section edit request is given for an
 non-existent section
 &$editpage: The current EditPage object
@@ -1609,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.
@@ -2231,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.
@@ -2878,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
@@ -3314,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.
@@ -3329,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
@@ -3521,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.
@@ -3767,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 dedb3a6..9db4c54 100644 (file)
@@ -26,7 +26,7 @@
 
                /** second table. Try to emulate child selector */
                table.childemu th,
-               table.childemu td {
+               table.childemu td {
                        border: 1px red solid;
                        background-color:white;
                        padding:1em;
index fa1609f..2052809 100644 (file)
@@ -68,7 +68,7 @@ function wfImageAuthMain() {
                $path = "/" . $path;
        }
 
-       // Check for bug 28235: QUERY_STRING overriding the correct extension
+       // Check for T30235: QUERY_STRING overriding the correct extension
        $whitelist = [];
        $extension = FileBackend::extensionFromPath( $path, 'rawcase' );
        if ( $extension != '' ) {
index 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 9d3a2f9..1f4041b 100644 (file)
@@ -265,7 +265,7 @@ class Block {
                }
 
                # Be aware that the != '' check is explicit, since empty values will be
-               # passed by some callers (bug 29116)
+               # passed by some callers (T31116)
                if ( $vagueTarget != '' ) {
                        list( $target, $type ) = self::parseTarget( $vagueTarget );
                        switch ( $type ) {
@@ -358,7 +358,7 @@ class Block {
                if ( $end === null ) {
                        $end = $start;
                }
-               # Per bug 14634, we want to include relevant active rangeblocks; for
+               # Per T16634, we want to include relevant active rangeblocks; for
                # rangeblocks, we want to include larger ranges which enclose the given
                # range. We know that all blocks must be smaller than $wgBlockCIDRLimit,
                # so we can improve performance by filtering on a LIKE clause
@@ -553,7 +553,7 @@ class Block {
                $affected = $dbw->affectedRows();
 
                if ( $this->isAutoblocking() ) {
-                       // update corresponding autoblock(s) (bug 48813)
+                       // update corresponding autoblock(s) (T50813)
                        $dbw->update(
                                'ipblocks',
                                $this->getAutoblockUpdateArray(),
@@ -1117,7 +1117,7 @@ class Block {
                } elseif ( $target === null && $vagueTarget == '' ) {
                        # We're not going to find anything useful here
                        # Be aware that the == '' check is explicit, since empty values will be
-                       # passed by some callers (bug 29116)
+                       # passed by some callers (T31116)
                        return null;
 
                } elseif ( in_array(
@@ -1142,7 +1142,7 @@ class Block {
         * Get all blocks that match any IP from an array of IP addresses
         *
         * @param array $ipChain List of IPs (strings), usually retrieved from the
-        *         X-Forwarded-For header of the request
+        *     X-Forwarded-For header of the request
         * @param bool $isAnon Exclude anonymous-only blocks if false
         * @param bool $fromMaster Whether to query the master or replica DB
         * @return array Array of Blocks
@@ -1223,9 +1223,9 @@ class Block {
         *
         * @param array $blocks Array of Block objects
         * @param array $ipChain List of IPs (strings). This is used to determine how "close"
-        *        a block is to the server, and if a block matches exactly, or is in a range.
-        *        The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
-        *        local-squid, ...)
+        *     a block is to the server, and if a block matches exactly, or is in a range.
+        *     The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
+        *     local-squid, ...)
         * @throws MWException
         * @return Block|null The "best" block from the list
         */
@@ -1467,9 +1467,55 @@ class Block {
                }
 
                // Set the cookie. Reformat the MediaWiki datetime as a Unix timestamp for the cookie.
-               $cookieValue = $setEmpty ? '' : $this->getId();
-               $expiryValue = DateTime::createFromFormat( "YmdHis", $expiryTime );
-               $response->setCookie( 'BlockID', $cookieValue, $expiryValue->format( "U" ) );
+               $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;
+               }
        }
 
        /**
index d558dbc..ece32ea 100644 (file)
@@ -96,7 +96,7 @@ class Category {
                $this->mSubcats = $row->cat_subcats;
                $this->mFiles = $row->cat_files;
 
-               # (bug 13683) If the count is negative, then 1) it's obviously wrong
+               # (T15683) If the count is negative, then 1) it's obviously wrong
                # and should not be kept, and 2) we *probably* don't have to scan many
                # rows to obtain the correct figure, so let's risk a one-time recount.
                if ( $this->mPages < 0 || $this->mSubcats < 0 || $this->mFiles < 0 ) {
index facf847..31369b0 100644 (file)
@@ -632,11 +632,12 @@ class CategoryViewer extends ContextSource {
        private function pagingLinks( $first, $last, $type = '' ) {
                $prevLink = $this->msg( 'prev-page' )->text();
 
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                if ( $first != '' ) {
                        $prevQuery = $this->query;
                        $prevQuery["{$type}until"] = $first;
                        unset( $prevQuery["{$type}from"] );
-                       $prevLink = Linker::linkKnown(
+                       $prevLink = $linkRenderer->makeKnownLink(
                                $this->addFragmentToTitle( $this->title, $type ),
                                $prevLink,
                                [],
@@ -650,7 +651,7 @@ class CategoryViewer extends ContextSource {
                        $lastQuery = $this->query;
                        $lastQuery["{$type}from"] = $last;
                        unset( $lastQuery["{$type}until"] );
-                       $nextLink = Linker::linkKnown(
+                       $nextLink = $linkRenderer->makeKnownLink(
                                $this->addFragmentToTitle( $this->title, $type ),
                                $nextLink,
                                [],
index eedf34c..add4bfa 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.
@@ -1338,7 +1337,7 @@ $wgXMLMimeTypes = [
  * to reduce disk usage, limits can only be selected from a list.
  * The user preference is saved as an array offset in the database, by default
  * the offset is set with $wgDefaultUserOptions['imagesize']. Make sure you
- * change it if you alter the array (see bug 8858).
+ * change it if you alter the array (see T10858).
  * This is the list of settings the user can choose from:
  */
 $wgImageLimits = [
@@ -1443,14 +1442,19 @@ $wgUseTinyRGBForJPGThumbnails = false;
  * Default parameters for the "<gallery>" tag
  */
 $wgGalleryOptions = [
-       'imagesPerRow' => 0, // Default number of images per-row in the gallery. 0 -> Adapt to screensize
-       'imageWidth' => 120, // Width of the cells containing images in galleries (in "px")
-       'imageHeight' => 120, // Height of the cells containing images in galleries (in "px")
-       'captionLength' => true, // Deprecated @since 1.28
-                                // Length to truncate filename to in caption when using "showfilename".
-                                // A value of 'true' will truncate the filename to one line using CSS
-                                // and will be the behaviour after deprecation.
-       'showBytes' => true, // Show the filesize in bytes in categories
+       // Default number of images per-row in the gallery. 0 -> Adapt to screensize
+       'imagesPerRow' => 0,
+       // Width of the cells containing images in galleries (in "px")
+       'imageWidth' => 120,
+       // Height of the cells containing images in galleries (in "px")
+       'imageHeight' => 120,
+       // Length to truncate filename to in caption when using "showfilename".
+       // A value of 'true' will truncate the filename to one line using CSS
+       // and will be the behaviour after deprecation.
+       // @deprecated since 1.28
+       'captionLength' => true,
+       // Show the filesize in bytes in categories
+       'showBytes' => true,
        'mode' => 'traditional',
 ];
 
@@ -2343,6 +2347,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
@@ -3343,7 +3360,7 @@ $wgDisableOutputCompression = false;
  *
  * Currently this appears to work fine in all browsers, but it's disabled by
  * default because it normalizes id's a bit too aggressively, breaking preexisting
- * content (particularly Cite).  See bug 27733, bug 27694, bug 27474.
+ * content (particularly Cite).  See T29733, T29694, T29474.
  */
 $wgExperimentalHtmlIds = false;
 
@@ -4067,7 +4084,7 @@ $wgMaxRedirects = 1;
  * Attempting to create a redirect to any of the pages in this array
  * will make the redirect fail.
  * Userlogout is hard-coded, so it does not need to be listed here.
- * (bug 10569) Disallow Mypage and Mytalk as well.
+ * (T12569) Disallow Mypage and Mytalk as well.
  *
  * As of now, this only checks special pages. Redirects to pages in
  * other namespaces cannot be invalidated by this variable.
@@ -4551,8 +4568,8 @@ $wgAuthManagerAutoConfig = [
                ],
                // Linking during login is experimental, enable at your own risk - T134952
                // MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class => [
-               //      'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
-               //      'sort' => 100,
+               //   'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
+               //   'sort' => 100,
                // ],
                MediaWiki\Auth\EmailNotificationSecondaryAuthenticationProvider::class => [
                        'class' => MediaWiki\Auth\EmailNotificationSecondaryAuthenticationProvider::class,
@@ -4772,6 +4789,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)
@@ -4787,7 +4805,7 @@ $wgReservedUsernames = [
  */
 $wgDefaultUserOptions = [
        'ccmeonemails' => 0,
-       'cols' => 80,
+       'cols' => 80, // @deprecated since 1.29 No longer used in core
        'date' => 'default',
        'diffonly' => 0,
        'disablemail' => 0,
@@ -4817,7 +4835,7 @@ $wgDefaultUserOptions = [
        'rcdays' => 7,
        'rcenhancedfilters' => 0,
        'rclimit' => 50,
-       'rows' => 25,
+       'rows' => 25, // @deprecated since 1.29 No longer used in core
        'showhiddencats' => 0,
        'shownumberswatching' => 1,
        'showtoolbar' => 1,
@@ -4850,9 +4868,7 @@ $wgDefaultUserOptions = [
 /**
  * An array of preferences to not show for the user
  */
-$wgHiddenPrefs = [
-       'rcenhancedfilters',
-];
+$wgHiddenPrefs = [];
 
 /**
  * Characters to prevent during new account creations.
@@ -5324,26 +5340,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 = [
@@ -5513,6 +5563,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
@@ -5624,7 +5683,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 = [];
@@ -5826,6 +5885,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
 
 /************************************************************************//**
@@ -5923,7 +5991,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;
 
@@ -6590,51 +6661,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.
  *
- * 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.
+ * 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.
  *
- * 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
+ * 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 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)
+ * 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 JSON-specific options are:
- *   * 'channel' -- if set, the 'channel' parameter is also set in JSON values.
+ * 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)
+ *
+ * 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',
@@ -8187,7 +8271,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 +8291,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;
@@ -8277,7 +8373,7 @@ $wgPagePropsHaveSortkey = true;
 /**
  * Port where you have HTTPS running
  * Supports HTTPS on non-standard ports
- * @see bug 65184
+ * @see T67184
  * @since 1.24
  */
 $wgHttpsPort = 443;
@@ -8465,6 +8561,7 @@ $wgCSPFalsePositiveUrls = [
        'https://atpixel.alephd.com' => true,
        'https://rtb.metrigo.com' => true,
        'https://d5p.de17a.com' => true,
+       'https://ad.lkqd.net/vpaid/vpaid.js' => true,
 ];
 
 /**
@@ -8484,6 +8581,25 @@ $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..bd92ff0 100644 (file)
  * @file
  */
 
+require_once __DIR__ . '/libs/mime/defines.php';
+require_once __DIR__ . '/libs/rdbms/defines.php';
+require_once __DIR__ . '/compat/normal/UtfNormalDefines.php';
+
 /**
  * @defgroup Constants MediaWiki constants
  */
@@ -97,8 +101,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 +155,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 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 acbd130..c22125a 100644 (file)
@@ -363,8 +363,8 @@ class EditPage {
        /** @var bool */
        public $bot = true;
 
-       /** @var null|string */
-       public $contentModel = null;
+       /** @var string */
+       public $contentModel;
 
        /** @var null|string */
        public $contentFormat = null;
@@ -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 ] ) ) {
@@ -837,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
@@ -990,7 +993,7 @@ class EditPage {
                        $this->recreate = false;
 
                        // When creating a new section, we can preload a section title by passing it as the
-                       // preloadtitle parameter in the URL (Bug 13100)
+                       // preloadtitle parameter in the URL (T15100)
                        if ( $this->section == 'new' && $request->getVal( 'preloadtitle' ) ) {
                                $this->sectiontitle = $request->getVal( 'preloadtitle' );
                                // Once wpSummary isn't being use for setting section titles, we should delete this.
@@ -1068,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();
@@ -1252,11 +1255,7 @@ class EditPage {
                }
                $revision = $this->mArticle->getRevisionFetched();
                if ( $revision === null ) {
-                       if ( !$this->contentModel ) {
-                               $this->contentModel = $this->getTitle()->getContentModel();
-                       }
                        $handler = ContentHandler::getForModelID( $this->contentModel );
-
                        return $handler->makeEmptyContent();
                }
                $content = $revision->getContent( Revision::FOR_THIS_USER, $user );
@@ -1296,11 +1295,7 @@ class EditPage {
                $content = $rev ? $rev->getContent( Revision::RAW ) : null;
 
                if ( $content === false || $content === null ) {
-                       if ( !$this->contentModel ) {
-                               $this->contentModel = $this->getTitle()->getContentModel();
-                       }
                        $handler = ContentHandler::getForModelID( $this->contentModel );
-
                        return $handler->makeEmptyContent();
                } elseif ( !$this->undidRev ) {
                        // Content models should always be the same since we error
@@ -1420,7 +1415,7 @@ class EditPage {
         * @return bool
         * @private
         */
-       function tokenOk( &$request ) {
+       public function tokenOk( &$request ) {
                global $wgUser;
                $token = $request->getVal( 'wpEditToken' );
                $this->mTokenOk = $wgUser->matchEditToken( $token );
@@ -1621,15 +1616,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;
@@ -1722,7 +1709,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;
 
@@ -1916,7 +1903,7 @@ class EditPage {
 
                        // Don't save a new page if it's blank or if it's a MediaWiki:
                        // message with content equivalent to default (allow empty pages
-                       // in this case to disable messages, see bug 50124)
+                       // in this case to disable messages, see T52124)
                        $defaultMessageText = $this->mTitle->getDefaultMessageText();
                        if ( $this->mTitle->getNamespace() === NS_MEDIAWIKI && $defaultMessageText !== false ) {
                                $defaultText = $defaultMessageText;
@@ -2278,7 +2265,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
@@ -2330,7 +2317,7 @@ class EditPage {
                return false;
        }
 
-       function setHeaders() {
+       public function setHeaders() {
                global $wgOut, $wgUser, $wgAjaxEditStash, $wgCookieSetOnAutoblock;
 
                $wgOut->addModules( 'mediawiki.action.edit' );
@@ -2488,11 +2475,13 @@ class EditPage {
                }
                # Give a notice if the user is editing a deleted/moved page...
                if ( !$this->mTitle->exists() ) {
+                       $dbr = wfGetDB( DB_REPLICA );
+
                        LogEventsList::showLogExtract( $wgOut, [ 'delete', 'move' ], $this->mTitle,
                                '',
                                [
                                        'lim' => 10,
-                                       'conds' => [ "log_action != 'revision'" ],
+                                       'conds' => [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ],
                                        'showIfEmpty' => false,
                                        'msgKey' => [ 'recreate-moveddeleted-warn' ]
                                ]
@@ -2590,7 +2579,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,
@@ -2621,7 +2610,7 @@ class EditPage {
                        return;
                }
 
-               $this->showHeader();
+               $this->showHeader();
 
                $wgOut->addHTML( $this->editFormPageTop );
 
@@ -2734,7 +2723,7 @@ class EditPage {
                if ( $this->hasPresetSummary ) {
                        // If a summary has been preset using &summary= we don't want to prompt for
                        // a different summary. Only prompt for a summary if the summary is blanked.
-                       // (Bug 17416)
+                       // (T19416)
                        $this->autoSumm = md5( '' );
                }
 
@@ -3032,7 +3021,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.
@@ -3287,14 +3276,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();
                }
        }
@@ -3306,7 +3295,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';
@@ -3548,15 +3537,7 @@ HTML
                // Avoid PHP 7.1 warning of passing $this by reference
                $editPage = $this;
                if ( Hooks::run( 'EditPageBeforeConflictDiff', [ &$editPage, &$wgOut ] ) ) {
-                       $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
-                       $stats->increment( 'edit.failures.conflict' );
-                       // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
-                       if (
-                               $this->mTitle->getNamespace() >= NS_MAIN &&
-                               $this->mTitle->getNamespace() <= NS_CATEGORY_TALK
-                       ) {
-                               $stats->increment( 'edit.failures.conflict.byNamespaceId.' . $this->mTitle->getNamespace() );
-                       }
+                       $this->incrementConflictStats();
 
                        $wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourdiff" );
 
@@ -3576,11 +3557,24 @@ HTML
                }
        }
 
+       protected 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() ) {
@@ -3588,9 +3582,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
                );
@@ -3683,12 +3677,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.
@@ -3701,7 +3693,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;
                }
 
@@ -3725,15 +3717,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;
@@ -3779,7 +3771,6 @@ HTML
                        }
 
                        $hook_args = [ $this, &$content ];
-                       ContentHandler::runLegacyHooks( 'EditPageGetPreviewText', $hook_args, '1.25' );
                        Hooks::run( 'EditPageGetPreviewContent', $hook_args );
 
                        $parserResult = $this->doPreviewParse( $content );
@@ -3822,6 +3813,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
@@ -3860,7 +3856,7 @@ HTML
        /**
         * @return array
         */
-       function getTemplates() {
+       public function getTemplates() {
                if ( $this->preview || $this->section != '' ) {
                        $templates = [];
                        if ( !isset( $this->mParserOutput ) ) {
@@ -3884,7 +3880,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;
 
@@ -4137,7 +4133,7 @@ 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' ) );
@@ -4441,8 +4437,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 071a3db..3268291 100644 (file)
@@ -129,13 +129,6 @@ class FeedUtils {
                }
 
                if ( $oldid ) {
-
-                       # $diffText = $de->getDiff( wfMessage( 'revisionasof',
-                       #       $wgLang->timeanddate( $timestamp ),
-                       #       $wgLang->date( $timestamp ),
-                       #       $wgLang->time( $timestamp ) )->text(),
-                       #       wfMessage( 'currentrev' )->text() );
-
                        $diffText = '';
                        // Don't bother generating the diff if we won't be able to show it
                        if ( $wgFeedDiffCutoff > 0 ) {
@@ -196,7 +189,7 @@ class FeedUtils {
 
                        if ( $html === null ) {
 
-                               // Omit large new page diffs, bug 29110
+                               // Omit large new page diffs, T31110
                                // Also use diff link for non-textual content
                                $diffText = self::getDiffLink( $title, $newid );
                        } else {
index f850152..f284d92 100644 (file)
@@ -21,6 +21,7 @@
  * @author Rob Church <robchur@gmail.com>
  * @ingroup Media
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * File deletion user interface
@@ -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 6549fdd..3747c23 100644 (file)
@@ -222,18 +222,18 @@ function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) {
 /**
  * Merge arrays in the style of getUserPermissionsErrors, with duplicate removal
  * e.g.
- *     wfMergeErrorArrays(
- *             [ [ 'x' ] ],
- *             [ [ 'x', '2' ] ],
- *             [ [ 'x' ] ],
- *             [ [ 'y' ] ]
- *     );
+ *     wfMergeErrorArrays(
+ *       [ [ 'x' ] ],
+ *       [ [ 'x', '2' ] ],
+ *       [ [ 'x' ] ],
+ *       [ [ 'y' ] ]
+ *     );
  * returns:
- *             [
- *             [ 'x', '2' ],
- *             [ 'x' ],
- *             [ 'y' ]
- *     ]
+ *     [
+ *       [ 'x', '2' ],
+ *       [ 'x' ],
+ *       [ 'y' ]
+ *     ]
  *
  * @param array $array1,...
  * @return array
@@ -1787,6 +1787,7 @@ function wfHttpError( $code, $label, $desc ) {
                $wgOut->sendCacheControl();
        }
 
+       MediaWiki\HeaderCallback::warnIfHeadersSent();
        header( 'Content-type: text/html; charset=utf-8' );
        print '<!DOCTYPE html>' .
                '<html><head><title>' .
@@ -1999,10 +2000,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
  *
@@ -2576,8 +2573,8 @@ function wfInitShellLocale() {
  * @param string $script MediaWiki cli script path
  * @param array $parameters Arguments and options to the script
  * @param array $options Associative array of options:
- *             'php': The path to the php executable
- *             'wrapper': Path to a PHP wrapper to handle the maintenance script
+ *     'php': The path to the php executable
+ *     'wrapper': Path to a PHP wrapper to handle the maintenance script
  * @return string
  */
 function wfShellWikiCmd( $script, array $parameters = [], array $options = [] ) {
@@ -3088,7 +3085,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 ) {
@@ -3104,7 +3101,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();
diff --git a/includes/HeaderCallback.php b/includes/HeaderCallback.php
new file mode 100644 (file)
index 0000000..b2ca673
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+
+namespace MediaWiki;
+
+class HeaderCallback {
+       private static $headersSentException;
+       private static $messageSent = false;
+
+       /**
+        * Register a callback to be called when headers are sent. There can only
+        * be one of these handlers active, so all relevant actions have to be in
+        * here.
+        */
+       public static function register() {
+               header_register_callback( [ __CLASS__, 'callback' ] );
+       }
+
+       /**
+        * The callback, which is called by the transport
+        */
+       public static function callback() {
+               // Prevent caching of responses with cookies (T127993)
+               $headers = [];
+               foreach ( headers_list() as $header ) {
+                       list( $name, $value ) = explode( ':', $header, 2 );
+                       $headers[strtolower( trim( $name ) )][] = trim( $value );
+               }
+
+               if ( isset( $headers['set-cookie'] ) ) {
+                       $cacheControl = isset( $headers['cache-control'] )
+                               ? implode( ', ', $headers['cache-control'] )
+                               : '';
+
+                       if ( !preg_match( '/(?:^|,)\s*(?:private|no-cache|no-store)\s*(?:$|,)/i',
+                               $cacheControl )
+                       ) {
+                               header( 'Expires: Thu, 01 Jan 1970 00:00:00 GMT' );
+                               header( 'Cache-Control: private, max-age=0, s-maxage=0' );
+                               \MediaWiki\Logger\LoggerFactory::getInstance( 'cache-cookies' )->warning(
+                                       'Cookies set on {url} with Cache-Control "{cache-control}"', [
+                                               'url' => \WebRequest::getGlobalRequestURL(),
+                                               'cookies' => $headers['set-cookie'],
+                                               'cache-control' => $cacheControl ?: '<not set>',
+                                       ]
+                               );
+                       }
+               }
+
+               // Save a backtrace for logging in case it turns out that headers were sent prematurely
+               self::$headersSentException = new \Exception( 'Headers already sent from this point' );
+       }
+
+       /**
+        * Log a warning message if headers have already been sent. This can be
+        * called before flushing the output.
+        */
+       public static function warnIfHeadersSent() {
+               if ( headers_sent() && !self::$messageSent ) {
+                       self::$messageSent = true;
+                       \MWDebug::warning( 'Headers already sent, should send headers earlier than ' .
+                               wfGetCaller( 3 ) );
+                       $logger = \MediaWiki\Logger\LoggerFactory::getInstance( 'headers-sent' );
+                       $logger->error( 'Warning: headers were already sent from the location below', [
+                               'exception' => self::$headersSentException,
+                               'detection-trace' => new \Exception( 'Detected here' ),
+                       ] );
+               }
+       }
+}
index 3d86201..56cf815 100644 (file)
@@ -590,7 +590,7 @@ class DiffHistoryBlob implements HistoryBlob {
 
        /**
         * Compute a binary "Adler-32" checksum as defined by LibXDiff, i.e. with
-        * the bytes backwards and initialised with 0 instead of 1. See bug 34428.
+        * the bytes backwards and initialised with 0 instead of 1. See T36428.
         *
         * @param string $s
         * @return string|bool False if the hash extension is not available
index 0b6b655..8fe4dbe 100644 (file)
@@ -220,8 +220,10 @@ class Html {
         * Identical to rawElement(), but HTML-escapes $contents (like
         * Xml::element()).
         *
-        * @param string $element
-        * @param array $attribs
+        * @param string $element Name of the element, e.g., 'a'
+        * @param array $attribs Associative array of attributes, e.g., [
+        *   'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
+        *   further documentation.
         * @param string $contents
         *
         * @return string
@@ -239,8 +241,10 @@ class Html {
         * Identical to rawElement(), but has no third parameter and omits the end
         * tag (and the self-closing '/' in XML mode for empty elements).
         *
-        * @param string $element
-        * @param array $attribs
+        * @param string $element Name of the element, e.g., 'a'
+        * @param array $attribs Associative array of attributes, e.g., [
+        *   'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
+        *   further documentation.
         *
         * @return string
         */
@@ -459,7 +463,7 @@ class Html {
         *
         * @param array $attribs Associative array of attributes, e.g., [
         *   'href' => 'https://www.mediawiki.org/' ].  Values will be HTML-escaped.
-        *   A value of false means to omit the attribute.  For boolean attributes,
+        *   A value of false or null means to omit the attribute.  For boolean attributes,
         *   you can omit the key, e.g., [ 'checked' ] instead of
         *   [ 'checked' => 'checked' ] or such.
         *
@@ -485,22 +489,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 = [
@@ -775,7 +763,7 @@ class Html {
                $attribs['name'] = $name;
 
                if ( substr( $value, 0, 1 ) == "\n" ) {
-                       // Workaround for bug 12130: browsers eat the initial newline
+                       // Workaround for T14130: browsers eat the initial newline
                        // assuming that it's just for show, but they do keep the later
                        // newlines, which we may want to preserve during editing.
                        // Prepending a single newline
index 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..0c8d1c6 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
         *
@@ -686,7 +590,7 @@ class Linker {
 
                # ThumbnailImage::toHtml() already adds page= onto the end of DjVu URLs
                # So we don't need to pass it here in $query. However, the URL for the
-               # zoom icon still needs it, so we make a unique query for it. See bug 14771
+               # zoom icon still needs it, so we make a unique query for it. See T16771
                $url = $title->getLocalURL( $query );
                if ( $page ) {
                        $url = wfAppendQuery( $url, [ 'page' => $page ] );
@@ -988,7 +892,7 @@ class Linker {
                        if ( $altUserName === false ) {
                                $altUserName = IP::prettifyIP( $userName );
                        }
-                       $classes .= ' mw-anonuserlink'; // Separate link class for anons (bug 43179)
+                       $classes .= ' mw-anonuserlink'; // Separate link class for anons (T45179)
                } else {
                        $page = Title::makeTitle( NS_USER, $userName );
                }
@@ -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;
        }
 
@@ -1182,7 +1096,7 @@ class Linker {
        ) {
                # Sanitize text a bit:
                $comment = str_replace( "\n", " ", $comment );
-               # Allow HTML entities (for bug 13815)
+               # Allow HTML entities (for T15815)
                $comment = Sanitizer::escapeHtmlAllowEntities( $comment );
 
                # Render autocomments and make links:
@@ -1251,7 +1165,7 @@ class Linker {
                                                $section = str_replace( '[[', '', $section );
                                                $section = str_replace( ']]', '', $section );
 
-                                               $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # bug 22784
+                                               $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # T24784
                                                if ( $local ) {
                                                        $sectionTitle = Title::newFromText( '#' . $section );
                                                } else {
@@ -1460,7 +1374,7 @@ class Linker {
                        } else {
                                $suffix = '';
                        }
-                       # bug 7425
+                       # T9425
                        $target = trim( $target );
                        # Look at the first character
                        if ( $target != '' && $target[0] === '/' ) {
@@ -1883,7 +1797,7 @@ class Linker {
 
                if ( $context->getRequest()->getBool( 'bot' ) ) {
                        $query['bot'] = '1';
-                       $query['hidediff'] = '1'; // bug 15999
+                       $query['hidediff'] = '1'; // T17999
                }
 
                $disableRollbackEditCount = false;
@@ -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 c1e5cc4..7f3649e 100644 (file)
@@ -21,6 +21,7 @@
  * @since 1.20
  * @author Tyler Romeo, 2012
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * Library for creating and parsing MW-style timestamps. Based on the JS
index 391e05a..ee95918 100644 (file)
@@ -46,8 +46,8 @@
  * $magicWords = [];
  *
  * $magicWords['en'] = [
- *     'magicwordkey' => [ 0, 'case_insensitive_magic_word' ],
- *     'magicwordkey2' => [ 1, 'CASE_sensitive_magic_word2' ],
+ *   'magicwordkey' => [ 0, 'case_insensitive_magic_word' ],
+ *   'magicwordkey2' => [ 1, 'CASE_sensitive_magic_word2' ],
  * ];
  * @endcode
  *
@@ -169,6 +169,7 @@ class MagicWord {
                'localtimestamp',
                'directionmark',
                'contentlanguage',
+               'pagelanguage',
                'numberofadmins',
                'cascadingsources',
        ];
@@ -501,7 +502,7 @@ class MagicWord {
                        # multiple matched parts (variable match); some will be empty because of
                        # synonyms. The variable will be the second non-empty one so remove any
                        # blank elements and re-sort the indices.
-                       # See also bug 6526
+                       # See also T8526
 
                        $matches = array_values( array_filter( $matches ) );
 
@@ -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 faca533..521c02c 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.
@@ -71,7 +73,7 @@ class MediaWiki {
                if ( $request->getCheck( 'search' ) ) {
                        // Compatibility with old search URLs which didn't use Special:Search
                        // Just check for presence here, so blank requests still
-                       // show the search page when using ugly URLs (bug 8054).
+                       // show the search page when using ugly URLs (T10054).
                        $ret = SpecialPage::getTitleFor( 'Search' );
                } elseif ( $curid ) {
                        // URLs like this are generated by RC, because rc_title isn't always accurate
@@ -181,7 +183,7 @@ class MediaWiki {
                $unused = null; // To pass it by reference
                Hooks::run( 'BeforeInitialize', [ &$title, &$unused, &$output, &$user, $request, $this ] );
 
-               // Invalid titles. Bug 21776: The interwikis must redirect even if the page name is empty.
+               // Invalid titles. T23776: The interwikis must redirect even if the page name is empty.
                if ( is_null( $title ) || ( $title->getDBkey() == '' && !$title->isExternal() )
                        || $title->isSpecial( 'Badtitle' )
                ) {
@@ -201,7 +203,7 @@ class MediaWiki {
                        ? [] // relies on HMAC key signature alone
                        : $title->getUserPermissionsErrors( 'read', $user );
                if ( count( $permErrors ) ) {
-                       // Bug 32276: allowing the skin to generate output with $wgTitle or
+                       // T34276: allowing the skin to generate output with $wgTitle or
                        // $this->context->title set to the input title would allow anonymous users to
                        // determine whether a page exists, potentially leaking private data. In fact, the
                        // curid and oldid request  parameters would allow page titles to be enumerated even
@@ -518,7 +520,7 @@ class MediaWiki {
                        try {
                                $this->main();
                        } catch ( ErrorPageError $e ) {
-                               // Bug 62091: while exceptions are convenient to bubble up GUI errors,
+                               // T64091: while exceptions are convenient to bubble up GUI errors,
                                // they are not internal application faults. As with normal requests, this
                                // should commit, print the output, do deferred updates, jobs, and profiling.
                                $this->doPreOutputCommit();
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 e57f880..8cf3af1 100644 (file)
@@ -24,6 +24,7 @@
  *
  * @file
  */
+use Wikimedia\Timestamp\TimestampException;
 
 /**
  * Handles the backend logic of merging the histories of two
index cbb4651..9a83d35 100644 (file)
@@ -233,9 +233,11 @@ class MovePage {
         * @param User $user
         * @param string $reason
         * @param bool $createRedirect
+        * @param string[] $changeTags Change tags to apply to the entry in the move log. Caller
+        *  should perform permission checks with ChangeTags::canAddTagsAccompanyingChange
         * @return Status
         */
-       public function move( User $user, $reason, $createRedirect ) {
+       public function move( User $user, $reason, $createRedirect, array $changeTags = [] ) {
                global $wgCategoryCollation;
 
                Hooks::run( 'TitleMove', [ $this->oldTitle, $this->newTitle, $user ] );
@@ -265,7 +267,8 @@ class MovePage {
                $protected = $this->oldTitle->isProtected();
 
                // Do the actual move; if this fails, it will throw an MWException(!)
-               $nullRevision = $this->moveToInternal( $user, $this->newTitle, $reason, $createRedirect );
+               $nullRevision = $this->moveToInternal( $user, $this->newTitle, $reason, $createRedirect,
+                       $changeTags );
 
                // Refresh the sortkey for this row.  Be careful to avoid resetting
                // cl_timestamp, which may disturb time-based lists on some sites.
@@ -356,6 +359,7 @@ class MovePage {
                                '4::oldtitle' => $this->oldTitle->getPrefixedText(),
                        ] );
                        $logEntry->setRelations( [ 'pr_id' => $logRelationsValues ] );
+                       $logEntry->setTags( $changeTags );
                        $logId = $logEntry->insert();
                        $logEntry->publish( $logId );
                }
@@ -424,18 +428,21 @@ class MovePage {
         * Move page to a title which is either a redirect to the
         * source page or nonexistent
         *
-        * @fixme This was basically directly moved from Title, it should be split into smaller functions
+        * @todo This was basically directly moved from Title, it should be split into
+        *   smaller functions
         * @param User $user the User doing the move
         * @param Title $nt The page to move to, which should be a redirect or non-existent
         * @param string $reason The reason for the move
         * @param bool $createRedirect Whether to leave a redirect at the old title. Does not check
         *   if the user has the suppressredirect right
+        * @param string[] $changeTags Change tags to apply to the entry in the move log
         * @return Revision the revision created by the move
         * @throws MWException
         */
-       private function moveToInternal( User $user, &$nt, $reason = '', $createRedirect = true ) {
-               global $wgContLang;
+       private function moveToInternal( User $user, &$nt, $reason = '', $createRedirect = true,
+               array $changeTags = [] ) {
 
+               global $wgContLang;
                if ( $nt->exists() ) {
                        $moveOverRedirect = true;
                        $logType = 'move_redir';
@@ -458,7 +465,7 @@ class MovePage {
                                /* $commit */ false,
                                $errs,
                                $user,
-                               [],
+                               $changeTags,
                                'delete_redir'
                        );
 
@@ -494,7 +501,7 @@ class MovePage {
                $defaultContentModelChanging = ( $oldDefault !== $newDefault
                        && $oldDefault === $contentModel );
 
-               // bug 57084: log_page should be the ID of the *moved* page
+               // T59084: log_page should be the ID of the *moved* page
                $oldid = $this->oldTitle->getArticleID();
                $logTitle = clone $this->oldTitle;
 
@@ -529,7 +536,8 @@ class MovePage {
                        throw new MWException( 'No valid null revision produced in ' . __METHOD__ );
                }
 
-               $nullRevision->insertOn( $dbw );
+               $nullRevId = $nullRevision->insertOn( $dbw );
+               $logEntry->setAssociatedRevId( $nullRevId );
 
                # Change the name of the target page:
                $dbw->update( 'page',
@@ -542,13 +550,13 @@ class MovePage {
                );
 
                if ( !$redirectContent ) {
-                       // Clean up the old title *before* reset article id - bug 45348
+                       // Clean up the old title *before* reset article id - T47348
                        WikiPage::onArticleDelete( $this->oldTitle );
                }
 
                $this->oldTitle->resetArticleID( 0 ); // 0 == non existing
                $nt->resetArticleID( $oldid );
-               $newpage->loadPageData( WikiPage::READ_LOCKING ); // bug 46397
+               $newpage->loadPageData( WikiPage::READ_LOCKING ); // T48397
 
                $newpage->updateRevisionOn( $dbw, $nullRevision );
 
@@ -573,7 +581,7 @@ class MovePage {
                # Recreate the redirect, this time in the other direction.
                if ( $redirectContent ) {
                        $redirectArticle = WikiPage::factory( $this->oldTitle );
-                       $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // bug 46397
+                       $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // T48397
                        $newid = $redirectArticle->insertOn( $dbw );
                        if ( $newid ) { // sanity
                                $this->oldTitle->resetArticleID( $newid );
@@ -584,18 +592,22 @@ class MovePage {
                                        'user' => $user->getId(),
                                        'comment' => $comment,
                                        'content' => $redirectContent ] );
-                               $redirectRevision->insertOn( $dbw );
+                               $redirectRevId = $redirectRevision->insertOn( $dbw );
                                $redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
 
                                Hooks::run( 'NewRevisionFromEditComplete',
                                        [ $redirectArticle, $redirectRevision, false, $user ] );
 
                                $redirectArticle->doEditUpdates( $redirectRevision, $user, [ 'created' => true ] );
+
+                               ChangeTags::addTags( $changeTags, null, $redirectRevId, null );
                        }
                }
 
                # Log the move
                $logid = $logEntry->insert();
+
+               $logEntry->setTags( $changeTags );
                $logEntry->publish( $logid );
 
                return $nullRevision;
index b0a6b7b..50950ef 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 
-# bug 30219 : can not use pathinfo() on URLs since slashes do not match
+# T32219 : can not use pathinfo() on URLs since slashes do not match
 $matches = [];
 $ext = 'php';
 $path = '/';
index 211f44b..9ecfa23 100644 (file)
@@ -534,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
         *
@@ -763,7 +781,7 @@ class OutputPage extends ContextSource {
                        'epoch' => $config->get( 'CacheEpoch' )
                ];
                if ( $config->get( 'UseSquid' ) ) {
-                       // bug 44570: the core page itself may not change, but resources might
+                       // T46570: the core page itself may not change, but resources might
                        $modifiedTimes['sepoch'] = wfTimestamp( TS_MW, time() - $config->get( 'SquidMaxage' ) );
                }
                Hooks::run( 'OutputPageCheckLastModified', [ &$modifiedTimes, $this ] );
@@ -1448,7 +1466,7 @@ class OutputPage extends ContextSource {
                        ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL
                );
 
-               // Site-wide styles are controlled by a config setting, see bug 71621
+               // Site-wide styles are controlled by a config setting, see T73621
                // for background on why. User styles are never allowed.
                if ( $this->getConfig()->get( 'AllowSiteCSSOnRestrictedPages' ) ) {
                        $styleOrigin = ResourceLoaderModule::ORIGIN_USER_SITEWIDE;
@@ -2484,7 +2502,7 @@ class OutputPage extends ContextSource {
                ) {
                        $displayReturnto = null;
 
-                       # Due to bug 32276, if a user does not have read permissions,
+                       # Due to T34276, if a user does not have read permissions,
                        # $this->getTitle() will just give Special:Badtitle, which is
                        # not especially useful as a returnto parameter. Use the title
                        # from the request instead, if there was one.
@@ -2515,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
                        );
@@ -3065,7 +3084,7 @@ class OutputPage extends ContextSource {
 
                $curRevisionId = 0;
                $articleId = 0;
-               $canonicalSpecialPageName = false; # bug 21115
+               $canonicalSpecialPageName = false; # T23115
 
                $title = $this->getTitle();
                $ns = $title->getNamespace();
@@ -3075,7 +3094,7 @@ class OutputPage extends ContextSource {
 
                $sk = $this->getSkin();
                // Get the relevant title so that AJAX features can use the correct page name
-               // when making API requests from certain special pages (bug 34972).
+               // when making API requests from certain special pages (T36972).
                $relevantTitle = $sk->getRelevantTitle();
                $relevantUser = $sk->getRelevantUser();
 
@@ -3258,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';
                        }
@@ -3562,7 +3583,6 @@ class OutputPage extends ContextSource {
        protected function buildExemptModules() {
                global $wgContLang;
 
-               $resourceLoader = $this->getResourceLoader();
                $chunks = [];
                // Things that go after the ResourceLoaderDynamicStyles marker
                $append = [];
@@ -3695,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
@@ -3703,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 );
        }
 
        /**
@@ -3822,7 +3855,7 @@ class OutputPage extends ContextSource {
         *    $wgOut->addWikiText( "<div class='error'>\n"
         *        . wfMessage( 'some-error' )->plain() . "\n</div>" );
         *
-        * The newline after the opening div is needed in some wikitext. See bug 19226.
+        * The newline after the opening div is needed in some wikitext. See T21226.
         *
         * @param string $wrap
         */
index e6e96c7..c56931e 100644 (file)
@@ -75,16 +75,17 @@ class PHPVersionCheck {
         * @return $this
         */
        function checkRequiredPHPVersion() {
-               if ( !function_exists( 'version_compare' )
-                    || version_compare( $this->getPHPImplVersion(), $this->minimumVersionPHP ) < 0
+               if (
+                       !function_exists( 'version_compare' )
+                       || version_compare( $this->getPHPImplVersion(), $this->minimumVersionPHP ) < 0
                ) {
                        $shortText = "MediaWiki $this->mwVersion requires at least PHP version"
-                                    . " $this->minimumVersionPHP, you are using PHP {$this->getPHPImplVersion()}.";
+                               . " $this->minimumVersionPHP, you are using PHP {$this->getPHPImplVersion()}.";
 
                        $longText = "Error: You might be using on older PHP version. \n"
-                                   . "MediaWiki $this->mwVersion needs PHP $this->minimumVersionPHP or higher.\n\n"
-                                   . "Check if you have a newer php executable with a different name, "
-                                   . "such as php5.\n\n";
+                               . "MediaWiki $this->mwVersion needs PHP $this->minimumVersionPHP or higher.\n\n"
+                               . "Check if you have a newer php executable with a different name, "
+                               . "such as php5.\n\n";
 
                        $longHtml = <<<HTML
                        Please consider <a href="http://www.php.net/downloads.php">upgrading your copy of PHP</a>.
@@ -112,10 +113,10 @@ HTML;
                        $shortText = "Installing some external dependencies (e.g. via composer) is required.";
 
                        $longText = "Error: You are missing some external dependencies. \n"
-                                   . "MediaWiki now also has some external dependencies that need to be installed\n"
-                                   . "via composer or from a separate git repo. Please see\n"
-                                   . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
-                                   . "for help on installing the required components.";
+                               . "MediaWiki now also has some external dependencies that need to be installed\n"
+                               . "via composer or from a separate git repo. Please see\n"
+                               . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
+                               . "for help on installing the required components.";
 
                        $longHtml = <<<HTML
                MediaWiki now also has some external dependencies that need to be installed via
@@ -150,12 +151,12 @@ HTML;
                        foreach ( $missingExtensions as $ext ) {
                                $missingExtText .= " * $ext <$baseUrl/$ext>\n";
                                $missingExtHtml .= "<li><b>$ext</b> "
-                                                  . "(<a href=\"$baseUrl/$ext\">more information</a>)</li>";
+                                       . "(<a href=\"$baseUrl/$ext\">more information</a>)</li>";
                        }
 
                        $cliText = "Error: Missing one or more required components of PHP.\n"
-                                  . "You are missing a required extension to PHP that MediaWiki needs.\n"
-                                  . "Please install:\n" . $missingExtText;
+                               . "You are missing a required extension to PHP that MediaWiki needs.\n"
+                               . "Please install:\n" . $missingExtText;
 
                        $longHtml = <<<HTML
                You are missing a required extension to PHP that MediaWiki
@@ -198,7 +199,7 @@ HTML;
                }
                $encLogo =
                        htmlspecialchars( str_replace( '//', '/', $dirname . '/' ) .
-                                         'resources/assets/mediawiki.png' );
+                               'resources/assets/mediawiki.png' );
                $shortHtml = htmlspecialchars( $shortText );
 
                header( 'Content-type: text/html; charset=UTF-8' );
index 263ff5b..b428e87 100644 (file)
@@ -55,8 +55,6 @@ class Preferences {
        /** @var array */
        protected static $saveFilters = [
                'timecorrection' => [ 'Preferences', 'filterTimezoneInput' ],
-               'cols' => [ 'Preferences', 'filterIntval' ],
-               'rows' => [ 'Preferences', 'filterIntval' ],
                'rclimit' => [ 'Preferences', 'filterIntval' ],
                'wllimit' => [ 'Preferences', 'filterIntval' ],
                'searchlimit' => [ 'Preferences', 'filterIntval' ],
@@ -122,7 +120,7 @@ class Preferences {
                        }
                }
 
-               # # Make sure that form fields have their parent set. See bug 41337.
+               # # Make sure that form fields have their parent set. See T43337.
                $dummyForm = new HTMLForm( [], $context );
 
                $disable = !$user->isAllowed( 'editmyoptions' );
@@ -224,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',
@@ -495,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";
                                        }
@@ -817,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',
@@ -838,6 +847,7 @@ class Preferences {
                                'label-message' => 'tog-minordefault',
                        ];
                }
+
                $defaultPreferences['forceeditsummary'] = [
                        'type' => 'toggle',
                        'section' => 'editing/editor',
@@ -956,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() )
                                );
                        }
 
@@ -1190,8 +1201,7 @@ class Preferences {
 
                if ( $dateopts ) {
                        if ( !in_array( 'default', $dateopts ) ) {
-                               $dateopts[] = 'default'; // Make sure default is always valid
-                                                                               // Bug 19237
+                               $dateopts[] = 'default'; // Make sure default is always valid T21237
                        }
 
                        // FIXME KLUGE: site default might not be valid for user language
index 48b1d72..62ee5c6 100644 (file)
@@ -231,7 +231,7 @@ abstract class PrefixSearch {
                        }
                }
 
-               # normalize searchKey, so aliases with spaces can be found - bug 25675
+               # normalize searchKey, so aliases with spaces can be found - T27675
                $searchKey = str_replace( ' ', '_', $searchKey );
                $searchKey = $wgContLang->caseFold( $searchKey );
 
@@ -243,7 +243,7 @@ abstract class PrefixSearch {
                }
 
                foreach ( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
-                       if ( !in_array( $page, SpecialPageFactory::getNames() ) ) {# bug 20885
+                       if ( !in_array( $page, SpecialPageFactory::getNames() ) ) {# T22885
                                continue;
                        }
 
@@ -256,7 +256,7 @@ abstract class PrefixSearch {
                $matches = [];
                foreach ( $keys as $pageKey => $page ) {
                        if ( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
-                               // bug 27671: Don't use SpecialPage::getTitleFor() here because it
+                               // T29671: Don't use SpecialPage::getTitleFor() here because it
                                // localizes its input leading to searches for e.g. Special:All
                                // returning Spezial:MediaWiki-Systemnachrichten and returning
                                // Spezial:Alle_Seiten twice when $wgLanguageCode == 'de'
index 454ffcc..a68c36f 100644 (file)
@@ -22,6 +22,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Handles the page protection UI and backend
@@ -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 8721ef9..4b9435a 100644 (file)
@@ -21,6 +21,8 @@
  */
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * @todo document
@@ -216,7 +218,7 @@ class Revision implements IDBAccessObject {
                        // Pre-1.5 ar_text row
                        $attribs['text'] = self::getRevisionText( $row, 'ar_' );
                        if ( $attribs['text'] === false ) {
-                               throw new MWException( 'Unable to load text from archive row (possibly bug 22624)' );
+                               throw new MWException( 'Unable to load text from archive row (possibly T24624)' );
                        }
                }
                return new self( $attribs );
@@ -1035,28 +1037,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
@@ -1803,6 +1783,7 @@ class Revision implements IDBAccessObject {
         *
         * @param Title $title
         * @param int $id
+        * @param int $flags
         * @return string|bool False if not found
         */
        static function getTimestampFromId( $title, $id, $flags = 0 ) {
index 052fd16..d909a65 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * List for revision table items for a single page
@@ -363,13 +364,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,
                        [],
@@ -391,9 +393,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 6779189..5f6abee 100644 (file)
@@ -344,12 +344,12 @@ class Sanitizer {
                        $space = '[\x09\x0a\x0c\x0d\x20]';
                        self::$attribsRegex =
                                "/(?:^|$space)({$attribFirst}{$attrib}*)
-                                 ($space*=$space*
+                                       ($space*=$space*
                                        (?:
-                                        # The attribute value: quoted or alone
-                                         \"([^\"]*)(?:\"|\$)
-                                        | '([^']*)(?:'|\$)
-                                         (((?!$space|>).)*)
+                                               # The attribute value: quoted or alone
+                                               \"([^\"]*)(?:\"|\$)
+                                               | '([^']*)(?:'|\$)
+                                               | (((?!$space|>).)*)
                                        )
                                )?(?=$space|\$)/sx";
                }
@@ -545,7 +545,7 @@ class Sanitizer {
                                                        $badtag = true;
                                                } elseif ( in_array( $t, $tagstack ) && !isset( $htmlnest[$t] ) ) {
                                                        $badtag = true;
-                                               #  Is it a self closed htmlpair ? (bug 5487)
+                                               #  Is it a self closed htmlpair ? (T7487)
                                                } elseif ( $brace == '/>' && isset( $htmlpairs[$t] ) ) {
                                                        // Eventually we'll just remove the self-closing
                                                        // slash, in order to be consistent with HTML5
@@ -922,7 +922,7 @@ class Sanitizer {
 
                // Normalize Halfwidth and Fullwidth Unicode block that IE6 might treat as ascii
                $value = preg_replace_callback(
-                       '/[!-[]-z]/u', // U+FF01 to U+FF5A, excluding U+FF3C (bug 58088)
+                       '/[!-[]-z]/u', // U+FF01 to U+FF5A, excluding U+FF3C (T60088)
                        function ( $matches ) {
                                $cp = UtfNormal\Utils::utf8ToCodepoint( $matches[0] );
                                if ( $cp === false ) {
@@ -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',
@@ -1507,7 +1508,7 @@ class Sanitizer {
 
        /**
         * Decode any character references, numeric or named entities,
-        * in the next and normalize the resulting string. (bug 14952)
+        * in the next and normalize the resulting string. (T16952)
         *
         * This is useful for page titles, not for text to be displayed,
         * MediaWiki allows HTML entities to escape normalization as a feature.
@@ -1925,7 +1926,7 @@ class Sanitizer {
         *   3.5.
         *
         * This function is an implementation of the specification as requested in
-        * bug 22449.
+        * T24449.
         *
         * Client-side forms will use the same standard validation rules via JS or
         * HTML 5 validation; additional restrictions can be enforced server-side
@@ -1948,7 +1949,7 @@ class Sanitizer {
 
                // Please note strings below are enclosed in brackets [], this make the
                // hyphen "-" a range indicator. Hence it is double backslashed below.
-               // See bug 26948
+               // See T28948
                $rfc5322_atext = "a-z0-9!#$%&'*+\\-\/=?^_`{|}~";
                $rfc1034_ldh_str = "a-z0-9\\-";
 
index 2babce7..e686cd8 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
@@ -244,7 +244,7 @@ if ( $wgUseInstantCommons ) {
                'transformVia404' => true,
                'fetchDescription' => true,
                'descriptionCacheExpiry' => 43200,
-               'apiThumbCacheExpiry' => 86400,
+               'apiThumbCacheExpiry' => 0,
        ];
 }
 /*
@@ -329,7 +329,7 @@ if ( $wgEnableEmail ) {
        $wgUseEnotif = $wgEnotifUserTalk || $wgEnotifWatchlist;
 } else {
        // Disable all other email settings automatically if $wgEnableEmail
-       // is set to false. - bug 63678
+       // is set to false. - T65678
        $wgAllowHTMLEmail = false;
        $wgEmailAuthentication = false; // do not require auth if you're not sending email anyway
        $wgEnableUserEmail = false;
@@ -507,10 +507,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' );
@@ -533,35 +529,6 @@ if ( $wgSharedDB && $wgSharedTables ) {
 // is complete.
 define( 'MW_SERVICE_BOOTSTRAP_COMPLETE', 1 );
 
-// Install a header callback to prevent caching of responses with cookies (T127993)
-if ( !$wgCommandLineMode ) {
-       header_register_callback( function () {
-               $headers = [];
-               foreach ( headers_list() as $header ) {
-                       list( $name, $value ) = explode( ':', $header, 2 );
-                       $headers[strtolower( trim( $name ) )][] = trim( $value );
-               }
-
-               if ( isset( $headers['set-cookie'] ) ) {
-                       $cacheControl = isset( $headers['cache-control'] )
-                               ? implode( ', ', $headers['cache-control'] )
-                               : '';
-
-                       if ( !preg_match( '/(?:^|,)\s*(?:private|no-cache|no-store)\s*(?:$|,)/i', $cacheControl ) ) {
-                               header( 'Expires: Thu, 01 Jan 1970 00:00:00 GMT' );
-                               header( 'Cache-Control: private, max-age=0, s-maxage=0' );
-                               MediaWiki\Logger\LoggerFactory::getInstance( 'cache-cookies' )->warning(
-                                       'Cookies set on {url} with Cache-Control "{cache-control}"', [
-                                               'url' => WebRequest::getGlobalRequestURL(),
-                                               'cookies' => $headers['set-cookie'],
-                                               'cache-control' => $cacheControl ?: '<not set>',
-                                       ]
-                               );
-                       }
-               }
-       } );
-}
-
 MWExceptionHandler::installHandler();
 
 require_once "$IP/includes/compat/normal/UtfNormalUtil.php";
@@ -888,7 +855,6 @@ if ( !$wgCommandLineMode ) {
        Pingback::schedulePingback();
 }
 
-wfDebug( "Fully initialised\n" );
 $wgFullyInitialised = true;
 
 Profiler::instance()->scopedProfileOut( $ps_extensions );
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 4d496e4..3ed6b8b 100644 (file)
@@ -134,7 +134,7 @@ class Title implements LinkTarget {
 
        /**
         * @var int Namespace index when there is no namespace. Don't change the
-        *   following default, NS_MAIN is hardcoded in several places. See bug 696.
+        *   following default, NS_MAIN is hardcoded in several places. See T2696.
         *   Zero except in {{transclusion}} tags.
         */
        public $mDefaultNamespace = NS_MAIN;
@@ -307,7 +307,7 @@ class Title implements LinkTarget {
                        }
                }
 
-               // Convert things like &eacute; &#257; or &#x3017; into normalized (bug 14952) text
+               // Convert things like &eacute; &#257; or &#x3017; into normalized (T16952) text
                $filteredText = Sanitizer::decodeCharReferencesAndNormalize( $text );
 
                $t = new Title();
@@ -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;
        }
 
@@ -2423,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
@@ -2431,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];
        }
 
        /**
@@ -2567,6 +2549,29 @@ class Title implements LinkTarget {
         *   protection, or false if there's none.
         */
        public function getTitleProtection() {
+               $protection = $this->getTitleProtectionInternal();
+               if ( $protection ) {
+                       if ( $protection['permission'] == 'sysop' ) {
+                               $protection['permission'] = 'editprotected'; // B/C
+                       }
+                       if ( $protection['permission'] == 'autoconfirmed' ) {
+                               $protection['permission'] = 'editsemiprotected'; // B/C
+                       }
+               }
+               return $protection;
+       }
+
+       /**
+        * Fetch title protection settings
+        *
+        * To work correctly, $this->loadRestrictions() needs to have access to the
+        * actual protections in the database without munging 'sysop' =>
+        * 'editprotected' and 'autoconfirmed' => 'editsemiprotected'. Other
+        * callers probably want $this->getTitleProtection() instead.
+        *
+        * @return array|bool
+        */
+       protected function getTitleProtectionInternal() {
                // Can't protect pages in special namespaces
                if ( $this->getNamespace() < 0 ) {
                        return false;
@@ -2594,12 +2599,6 @@ class Title implements LinkTarget {
                        // fetchRow returns false if there are no rows.
                        $row = $dbr->fetchRow( $res );
                        if ( $row ) {
-                               if ( $row['permission'] == 'sysop' ) {
-                                       $row['permission'] = 'editprotected'; // B/C
-                               }
-                               if ( $row['permission'] == 'autoconfirmed' ) {
-                                       $row['permission'] = 'editsemiprotected'; // B/C
-                               }
                                $row['expiry'] = $dbr->decodeExpiry( $row['expiry'] );
                        }
                        $this->mTitleProtection = $row;
@@ -2997,7 +2996,7 @@ class Title implements LinkTarget {
 
                        $this->loadRestrictionsFromRows( $rows, $oldFashionedRestrictions );
                } else {
-                       $title_protection = $this->getTitleProtection();
+                       $title_protection = $this->getTitleProtectionInternal();
 
                        if ( $title_protection ) {
                                $now = wfTimestampNow();
@@ -3672,9 +3671,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 ) ) {
@@ -3688,7 +3690,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 {
@@ -3704,12 +3706,15 @@ 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
         *     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' ) ) {
@@ -3753,18 +3758,18 @@ class Title implements LinkTarget {
                        }
                        $newPageName = preg_replace(
                                        '#^' . preg_quote( $this->getDBkey(), '#' ) . '#',
-                                       StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # bug 21234
+                                       StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # T23234
                                        $oldSubpage->getDBkey() );
                        if ( $oldSubpage->isTalkPage() ) {
                                $newNs = $nt->getTalkPage()->getNamespace();
                        } else {
                                $newNs = $nt->getSubjectPage()->getNamespace();
                        }
-                       # Bug 14385: we need makeTitleSafe because the new page names may
+                       # T16385: we need makeTitleSafe because the new page names may
                        # be longer than 255 characters.
                        $newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
 
-                       $success = $oldSubpage->moveTo( $newSubpage, $auth, $reason, $createRedirect );
+                       $success = $oldSubpage->moveTo( $newSubpage, $auth, $reason, $createRedirect, $changeTags );
                        if ( $success === true ) {
                                $retval[$oldSubpage->getPrefixedText()] = $newSubpage->getPrefixedText();
                        } else {
@@ -3877,7 +3882,7 @@ class Title implements LinkTarget {
         * categories' names.
         *
         * @return array Array of parents in the form:
-        *        $parent => $currentarticle
+        *     $parent => $currentarticle
         */
        public function getParentCategories() {
                global $wgContLang;
index 5a28b85..bf2344b 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * The TitleArray class only exists to provide the newFromResult method at pre-
  * sent.
index 668ea54..189fb40 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 class TitleArrayFromResult extends TitleArray implements Countable {
        /** @var ResultWrapper */
        public $res;
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 c80e4a5..bc57049 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.
@@ -401,7 +402,7 @@ class WatchedItemQueryService {
                if ( !isset( $options['start'] ) && !isset( $options['end'] ) ) {
                        if ( $db->getType() === 'mysql' ) {
                                // This is an index optimization for mysql
-                               $conds[] = "rc_timestamp > ''";
+                               $conds[] = 'rc_timestamp > ' . $db->addQuotes( '' );
                        }
                }
 
@@ -504,7 +505,7 @@ class WatchedItemQueryService {
                        $conds[] = 'rc_user_text != ' . $db->addQuotes( $options['notByUser'] );
                }
 
-               // Avoid brute force searches (bug 17342)
+               // Avoid brute force searches (T19342)
                $bitmask = 0;
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $bitmask = Revision::DELETED_USER;
index 8fcf131..6301576 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Extension mechanism for WatchedItemQueryService
  *
index 3cdc59c..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.
@@ -734,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 3bbdc3f..3d5e372 100644 (file)
@@ -216,7 +216,7 @@ class WebRequest {
 
                        $host = $parts[0];
                        if ( $wgAssumeProxiesUseDefaultProtocolPorts && isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) {
-                               // Bug 70021: Assume that upstream proxy is running on the default
+                               // T72021: Assume that upstream proxy is running on the default
                                // port based on the protocol. We have no reliable way to determine
                                // the actual port in use upstream.
                                $port = $stdPort;
@@ -308,7 +308,7 @@ class WebRequest {
         * available variant URLs.
         */
        public function interpolateTitle() {
-               // bug 16019: title interpolation on API queries is useless and sometimes harmful
+               // T18019: title interpolation on API queries is useless and sometimes harmful
                if ( defined( 'MW_API' ) ) {
                        return;
                }
@@ -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 );
@@ -1229,7 +1229,7 @@ HTML;
                                if (
                                        IP::isPublic( $ipchain[$i + 1] ) ||
                                        $wgUsePrivateIPs ||
-                                       $proxyLookup->isConfiguredProxy( $curIP ) // bug 48919; treat IP as sane
+                                       $proxyLookup->isConfiguredProxy( $curIP ) // T50919; treat IP as sane
                                ) {
                                        // Follow the next IP according to the proxy
                                        $nextIP = IP::canonicalize( $ipchain[$i + 1] );
index 339b2e3..0208a72 100644 (file)
@@ -39,6 +39,7 @@ 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 ) {
+               \MediaWiki\HeaderCallback::warnIfHeadersSent();
                if ( $http_response_code ) {
                        header( $string, $replace, $http_response_code );
                } else {
index d063ce3..15804c7 100644 (file)
@@ -30,7 +30,7 @@ if ( ini_get( 'mbstring.func_overload' ) ) {
        die( 'MediaWiki does not support installations where mbstring.func_overload is non-zero.' );
 }
 
-# bug 15461: Make IE8 turn off content sniffing. Everybody else should ignore this
+# T17461: Make IE8 turn off content sniffing. Everybody else should ignore this
 # We're adding it here so that it's *always* set, even for alternate entry
 # points and when $wgOut gets disabled or overridden.
 header( 'X-Content-Type-Options: nosniff' );
@@ -104,6 +104,9 @@ if ( !interface_exists( 'Psr\Log\LoggerInterface' ) ) {
        die( 1 );
 }
 
+# Install a header callback
+MediaWiki\HeaderCallback::register();
+
 if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
        # Use a callback function to configure MediaWiki
        call_user_func( MW_CONFIG_CALLBACK );
@@ -133,9 +136,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 e124c38..d24a27c 100644 (file)
@@ -59,8 +59,8 @@ class Xml {
         * Given an array of ('attributename' => 'value'), it generates the code
         * to set the XML attributes : attributename="value".
         * The values are passed to Sanitizer::encodeAttribute.
-        * Return null if no attributes given.
-        * @param array $attribs Array of attributes for an XML element
+        * Returns null or empty string if no attributes given.
+        * @param array|null $attribs Array of attributes for an XML element
         * @throws MWException
         * @return null|string
         */
@@ -563,6 +563,36 @@ class Xml {
                        . Xml::closeElement( 'select' );
        }
 
+       /**
+        * Converts textual drop-down list to array
+        *
+        * @param string $list Correctly formatted text (newline delimited) to be
+        *   used to generate the options.
+        * @return array
+        */
+       public static function getArrayFromWikiTextList( $list = '' ) {
+               $options = [];
+
+               foreach ( explode( "\n", $list ) as $option ) {
+                       $value = trim( $option );
+                       if ( $value == '' ) {
+                               continue;
+                       } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
+                               // A new group is starting ...
+                               $value = trim( substr( $value, 1 ) );
+                               $options[] = $value;
+                       } elseif ( substr( $value, 0, 2 ) == '**' ) {
+                               // groupmember
+                               $value = trim( substr( $value, 2 ) );
+                               $options[] = $value;
+                       } else {
+                               // groupless reason list
+                               $options[] = $value;
+                       }
+               }
+               return $options;
+       }
+
        /**
         * Shortcut for creating fieldsets.
         *
index e8aec1c..d1be7d4 100644 (file)
@@ -24,6 +24,8 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * This class handles printing the history page for an article. In order to
@@ -146,6 +148,9 @@ class HistoryAction extends FormlessAction {
                                $out->setStatusCode( 404 );
                        }
                        $out->addWikiMsg( 'nohistory' );
+
+                       $dbr = wfGetDB( DB_REPLICA );
+
                        # show deletion/move log if there is an entry
                        LogEventsList::showLogExtract(
                                $out,
@@ -153,7 +158,7 @@ class HistoryAction extends FormlessAction {
                                $this->getTitle(),
                                '',
                                [ 'lim' => 10,
-                                       'conds' => [ "log_action != 'revision'" ],
+                                       'conds' => [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ],
                                        'showIfEmpty' => false,
                                        'msgKey' => [ 'moveddeleted-notice' ]
                                ]
index 5fb83b3..167b709 100644 (file)
@@ -835,7 +835,7 @@ class InfoAction extends FormlessAction {
                $real_names = [];
                $user_names = [];
                $anon_ips = [];
-               $linkRenderer = MediaWikiServices::getLinkRenderer();
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
 
                # Sift for real versus user names
                /** @var $user User */
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 5327d7a..d037c36 100644 (file)
@@ -208,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 063d661..c03faf0 100644 (file)
@@ -180,6 +180,12 @@ abstract class ApiBase extends ContextSource {
         */
        const PARAM_ALL = 17;
 
+       /**
+        * (int[]) When PARAM_TYPE is 'namespace', include these as additional possible values.
+        * @since 1.29
+        */
+       const PARAM_EXTRA_NAMESPACES = 18;
+
        /**@}*/
 
        const ALL_DEFAULT_STRING = '*';
@@ -694,7 +700,7 @@ abstract class ApiBase extends ContextSource {
         * @return array
         */
        public function extractRequestParams( $parseLimit = true ) {
-               // Cache parameters, for performance and to avoid bug 24564.
+               // Cache parameters, for performance and to avoid T26564.
                if ( !isset( $this->mParamCache[$parseLimit] ) ) {
                        $params = $this->getFinalParams();
                        $results = [];
@@ -899,6 +905,34 @@ abstract class ApiBase extends ContextSource {
                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'
@@ -953,44 +987,41 @@ abstract class ApiBase extends ContextSource {
                // Some classes may decide to change parameter names
                $encParamName = $this->encodeParamName( $paramName );
 
+               // Shorthand
                if ( !is_array( $paramSettings ) ) {
-                       $default = $paramSettings;
-                       $multi = false;
-                       $type = gettype( $paramSettings );
-                       $dupes = false;
-                       $deprecated = false;
-                       $required = false;
-                       $allowAll = false;
-               } else {
-                       $default = isset( $paramSettings[self::PARAM_DFLT] )
-                               ? $paramSettings[self::PARAM_DFLT]
-                               : null;
-                       $multi = isset( $paramSettings[self::PARAM_ISMULTI] )
-                               ? $paramSettings[self::PARAM_ISMULTI]
-                               : false;
-                       $type = isset( $paramSettings[self::PARAM_TYPE] )
-                               ? $paramSettings[self::PARAM_TYPE]
-                               : null;
-                       $dupes = isset( $paramSettings[self::PARAM_ALLOW_DUPLICATES] )
-                               ? $paramSettings[self::PARAM_ALLOW_DUPLICATES]
-                               : false;
-                       $deprecated = isset( $paramSettings[self::PARAM_DEPRECATED] )
-                               ? $paramSettings[self::PARAM_DEPRECATED]
-                               : false;
-                       $required = isset( $paramSettings[self::PARAM_REQUIRED] )
-                               ? $paramSettings[self::PARAM_REQUIRED]
-                               : false;
-                       $allowAll = isset( $paramSettings[self::PARAM_ALL] )
-                               ? $paramSettings[self::PARAM_ALL]
-                               : false;
-
-                       // When type is not given, and no choices, the type is the same as $default
-                       if ( !isset( $type ) ) {
-                               if ( isset( $default ) ) {
-                                       $type = gettype( $default );
-                               } else {
-                                       $type = 'NULL'; // allow everything
-                               }
+                       $paramSettings = [
+                               self::PARAM_DFLT => $paramSettings,
+                       ];
+               }
+
+               $default = isset( $paramSettings[self::PARAM_DFLT] )
+                       ? $paramSettings[self::PARAM_DFLT]
+                       : null;
+               $multi = isset( $paramSettings[self::PARAM_ISMULTI] )
+                       ? $paramSettings[self::PARAM_ISMULTI]
+                       : false;
+               $type = isset( $paramSettings[self::PARAM_TYPE] )
+                       ? $paramSettings[self::PARAM_TYPE]
+                       : null;
+               $dupes = isset( $paramSettings[self::PARAM_ALLOW_DUPLICATES] )
+                       ? $paramSettings[self::PARAM_ALLOW_DUPLICATES]
+                       : false;
+               $deprecated = isset( $paramSettings[self::PARAM_DEPRECATED] )
+                       ? $paramSettings[self::PARAM_DEPRECATED]
+                       : false;
+               $required = isset( $paramSettings[self::PARAM_REQUIRED] )
+                       ? $paramSettings[self::PARAM_REQUIRED]
+                       : false;
+               $allowAll = isset( $paramSettings[self::PARAM_ALL] )
+                       ? $paramSettings[self::PARAM_ALL]
+                       : false;
+
+               // When type is not given, and no choices, the type is the same as $default
+               if ( !isset( $type ) ) {
+                       if ( isset( $default ) ) {
+                               $type = gettype( $default );
+                       } else {
+                               $type = 'NULL'; // allow everything
                        }
                }
 
@@ -1034,6 +1065,11 @@ abstract class ApiBase extends ContextSource {
 
                        if ( isset( $value ) && $type == 'namespace' ) {
                                $type = MWNamespace::getValidNamespaces();
+                               if ( isset( $paramSettings[self::PARAM_EXTRA_NAMESPACES] ) &&
+                                       is_array( $paramSettings[self::PARAM_EXTRA_NAMESPACES] )
+                               ) {
+                                       $type = array_merge( $type, $paramSettings[self::PARAM_EXTRA_NAMESPACES] );
+                               }
                                // By default, namespace parameters allow ALL_DEFAULT_STRING to be used to specify
                                // all namespaces.
                                $allowAll = true;
@@ -1290,7 +1326,7 @@ abstract class ApiBase extends ContextSource {
                }
 
                if ( !$allowMultiple && count( $valuesList ) != 1 ) {
-                       // Bug 33482 - Allow entries with | in them for non-multiple values
+                       // T35482 - Allow entries with | in them for non-multiple values
                        if ( in_array( $value, $allowedValues, true ) ) {
                                return $value;
                        }
@@ -1682,6 +1718,18 @@ abstract class ApiBase extends ContextSource {
                        $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' );
        }
 
        /**
index 3774f09..8577ad2 100644 (file)
@@ -39,8 +39,6 @@ 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();
@@ -48,7 +46,7 @@ class ApiBlock extends ApiBase {
 
                $this->requireOnlyOneParameter( $params, 'user', 'userid' );
 
-               # bug 15810: blocked admins should have limited access here
+               # T17810: blocked admins should have limited access here
                if ( $user->isBlocked() ) {
                        $status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
                        if ( $status !== true ) {
@@ -71,7 +69,7 @@ class ApiBlock extends ApiBase {
                } else {
                        $target = User::newFromName( $params['user'] );
 
-                       // Bug 38633 - if the target is a user (not an IP address), but it
+                       // T40633 - if the target is a user (not an IP address), but it
                        // doesn't exist or is unusable, error.
                        if ( $target instanceof User &&
                                ( $target->isAnon() /* doesn't exist */ || !User::isUsableName( $target->getName() ) )
@@ -80,6 +78,13 @@ class ApiBlock extends ApiBase {
                        }
                }
 
+               if ( $params['tags'] ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
+               }
+
                if ( $params['hidename'] && !$user->isAllowed( 'hideuser' ) ) {
                        $this->dieWithError( 'apierror-canthide' );
                }
@@ -105,6 +110,7 @@ class ApiBlock extends ApiBase {
                        'Reblock' => $params['reblock'],
                        'Watch' => $params['watchuser'],
                        'Confirm' => true,
+                       'Tags' => $params['tags'],
                ];
 
                $retval = SpecialBlock::processForm( $data, $this->getContext() );
@@ -118,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
@@ -164,6 +170,10 @@ class ApiBlock extends ApiBase {
                        'allowusertalk' => false,
                        'reblock' => false,
                        'watchuser' => false,
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index 814004a..c52b731 100644 (file)
@@ -414,12 +414,17 @@ class ApiErrorFormatter_BackCompat extends ApiErrorFormatter {
 
                if ( $tag === 'error' ) {
                        // In BC mode, only one error
-                       $value = [
-                               'code' => $msg->getApiCode(),
-                               'info' => $value,
-                       ] + $msg->getApiData();
-                       $this->result->addValue( null, 'error', $value,
-                               ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
+                       $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 );
+                       }
                } else {
                        if ( $modulePath === null ) {
                                $moduleName = 'unknown';
index e0e50ed..0b04c8c 100644 (file)
@@ -57,7 +57,7 @@ class ApiFeedRecentChanges extends ApiBase {
 
                $this->getMain()->setCacheMode( 'public' );
                if ( !$this->getMain()->getParameter( 'smaxage' ) ) {
-                       // bug 63249: This page gets hit a lot, cache at least 15 seconds.
+                       // T65249: This page gets hit a lot, cache at least 15 seconds.
                        $this->getMain()->setCacheMaxAge( 15 );
                }
 
index b9bb761..7f349bc 100644 (file)
@@ -52,6 +52,7 @@ class ApiFeedWatchlist extends ApiBase {
        public function execute() {
                $config = $this->getConfig();
                $feedClasses = $config->get( 'FeedClasses' );
+               $params = [];
                try {
                        $params = $this->extractRequestParams();
 
index 67f54a8..83c348b 100644 (file)
@@ -186,7 +186,7 @@ abstract class ApiFormatBase extends ApiBase {
 
                $this->getMain()->getRequest()->response()->header( "Content-Type: $mime; charset=utf-8" );
 
-               // Set X-Frame-Options API results (bug 39180)
+               // Set X-Frame-Options API results (T41180)
                $apiFrameOptions = $this->getConfig()->get( 'ApiFrameOptions' );
                if ( $apiFrameOptions ) {
                        $this->getMain()->getRequest()->response()->header( "X-Frame-Options: $apiFrameOptions" );
@@ -269,7 +269,7 @@ abstract class ApiFormatBase extends ApiBase {
                                        false, FormatJson::ALL_OK
                                );
 
-                               // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+                               // T68776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
                                // Flash, but what it does isn't friendly for the API, so we need to
                                // work around it.
                                if ( preg_match( '/\<\s*cross-domain-policy\s*\>/i', $json ) ) {
index 8ebfe48..e5dafae 100644 (file)
@@ -91,7 +91,7 @@ class ApiFormatJson extends ApiFormatBase {
                $data = $this->getResult()->getResultData( null, $transform );
                $json = FormatJson::encode( $data, $this->getIsHtml(), $opt );
 
-               // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+               // T68776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
                // Flash, but what it does isn't friendly for the API, so we need to
                // work around it.
                if ( preg_match( '/\<\s*cross-domain-policy(?=\s|\>)/i', $json ) ) {
@@ -103,7 +103,7 @@ class ApiFormatJson extends ApiFormatBase {
                if ( isset( $params['callback'] ) ) {
                        $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $params['callback'] );
                        # Prepend a comment to try to avoid attacks against content
-                       # sniffers, such as bug 68187.
+                       # sniffers, such as T70187.
                        $this->printText( "/**/$callback($json)" );
                } else {
                        $this->printText( $json );
index a744f57..671f356 100644 (file)
@@ -60,7 +60,7 @@ class ApiFormatPhp extends ApiFormatBase {
                }
                $text = serialize( $this->getResult()->getResultData( null, $transforms ) );
 
-               // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+               // T68776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
                // Flash, but what it does isn't friendly for the API. There's nothing
                // we can do here that isn't actively broken in some manner, so let's
                // just be broken in a useful manner.
index 9a0d3ff..e347a9f 100644 (file)
@@ -547,6 +547,12 @@ class ApiHelp extends ApiBase {
 
                                                                case 'namespace':
                                                                        $namespaces = MWNamespace::getValidNamespaces();
+                                                                       if ( isset( $settings[ApiBase::PARAM_EXTRA_NAMESPACES] ) &&
+                                                                               is_array( $settings[ApiBase::PARAM_EXTRA_NAMESPACES] )
+                                                                       ) {
+                                                                               $namespaces = array_merge( $namespaces, $settings[ApiBase::PARAM_EXTRA_NAMESPACES] );
+                                                                       }
+                                                                       sort( $namespaces );
                                                                        $count = count( $namespaces );
                                                                        $info[] = $context->msg( 'api-help-param-list' )
                                                                                ->params( $multi ? 2 : 1 )
index dffd6b2..bf5e4ce 100644 (file)
@@ -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,6 +87,9 @@ class ApiImport extends ApiBase {
                        $params['interwikisource'],
                        $params['summary']
                );
+               if ( $params['tags'] ) {
+                       $reporter->setChangeTags( $params['tags'] );
+               }
 
                try {
                        $importer->doImport();
@@ -140,6 +151,10 @@ class ApiImport extends ApiBase {
                                ApiBase::PARAM_TYPE => 'namespace'
                        ],
                        'rootpage' => null,
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index 6cf1fad..d64aeb7 100644 (file)
@@ -70,14 +70,7 @@ class ApiLogin extends ApiBase {
                        return;
                }
 
-               try {
-                       $this->requirePostedParameters( [ 'password', 'token' ] );
-               } catch ( ApiUsageException $ex ) {
-                       // Make this a warning for now, upgrade to an error in 1.29.
-                       foreach ( $ex->getStatusValue()->getErrors() as $error ) {
-                               $this->addDeprecation( $error, 'login-params-in-query-string' );
-                       }
-               }
+               $this->requirePostedParameters( [ 'password', 'token' ] );
 
                $params = $this->extractRequestParams();
 
@@ -209,7 +202,7 @@ class ApiLogin extends ApiBase {
 
                        case 'Aborted':
                                $result['reason'] = 'Authentication requires user interaction, ' .
-                                  'which is not supported by action=login.';
+                                       'which is not supported by action=login.';
                                if ( $this->getConfig()->get( 'EnableBotPasswords' ) ) {
                                        $result['reason'] .= ' To be able to login with action=login, see [[Special:BotPasswords]].';
                                        $result['reason'] .= ' To continue using main-account login, see action=clientlogin.';
index 52f1d95..604fdf9 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Timestamp\TimestampException;
 
 /**
  * This is the main API class, used for both external and internal processing.
@@ -574,7 +575,7 @@ class ApiMain extends ApiBase {
         * @param Exception $e
         */
        protected function handleException( Exception $e ) {
-               // Bug 63145: Rollback any open database transactions
+               // T65145: Rollback any open database transactions
                if ( !( $e instanceof ApiUsageException || $e instanceof UsageException ) ) {
                        // UsageExceptions are intentional, so don't rollback if that's the case
                        try {
@@ -1109,10 +1110,16 @@ class ApiMain extends ApiBase {
                        $result->addContentValue(
                                $path,
                                'docref',
-                               $this->msg( 'api-usage-docref', $link )->inLanguage( $formatter->getLanguage() )->text()
+                               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' ) ) {
+                       if ( $config->get( 'ShowExceptionDetails' ) &&
+                               ( !$e instanceof DBError || $config->get( 'ShowDBErrorBacktrace' ) )
+                       ) {
                                $result->addContentValue(
                                        $path,
                                        'trace',
@@ -1662,7 +1669,7 @@ class ApiMain extends ApiBase {
                $ret = $this->getRequest()->getVal( $name );
                if ( $ret === null ) {
                        if ( $this->getRequest()->getArray( $name ) !== null ) {
-                               // See bug 10262 for why we don't just implode( '|', ... ) the
+                               // See T12262 for why we don't just implode( '|', ... ) the
                                // array.
                                $this->addWarning( [ 'apiwarn-unsupportedarray', $name ] );
                        }
index 3299f73..3c08093 100644 (file)
@@ -27,6 +27,7 @@ class ApiManageTags extends ApiBase {
 
        public function execute() {
                $params = $this->extractRequestParams();
+               $user = $this->getUser();
 
                // make sure the user is allowed
                if ( $params['operation'] !== 'delete'
@@ -37,10 +38,23 @@ class ApiManageTags extends ApiBase {
                        $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 );
@@ -57,6 +71,7 @@ class ApiManageTags extends ApiBase {
                if ( $ret['success'] ) {
                        $ret['logid'] = $status->value;
                }
+
                $result->addValue( null, $this->getModuleName(), $ret );
        }
 
@@ -85,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 18e582d..566f778 100644 (file)
@@ -77,9 +77,18 @@ class ApiMove extends ApiBase {
                        $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 );
                }
@@ -94,7 +103,7 @@ class ApiMove extends ApiBase {
                // a redirect to the new title. This is not safe, but what we did before was
                // even worse: we just determined whether a redirect should have been created,
                // and reported that it was created if it should have, without any checks.
-               // Also note that isRedirect() is unreliable because of bug 37209.
+               // Also note that isRedirect() is unreliable because of T39209.
                $r['redirectcreated'] = $fromTitle->exists();
 
                $r['moveoverredirect'] = $toTitleExists;
@@ -102,7 +111,13 @@ class ApiMove extends ApiBase {
                // Move the talk page
                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();
@@ -117,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' );
                        }
                }
@@ -149,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 );
        }
 
        /**
@@ -176,11 +203,13 @@ 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] ) ) {
                        $status = $this->errorArrayToStatus( $success );
                        return [ 'errors' => $this->getErrorFormatter()->arrayFromStatus( $status ) ];
@@ -242,7 +271,11 @@ class ApiMove extends ApiBase {
                                        'nochange'
                                ],
                        ],
-                       'ignorewarnings' => false
+                       'ignorewarnings' => false,
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index d42e306..7d16af8 100644 (file)
@@ -24,6 +24,7 @@
  * @file
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * This class contains a list of pages that the client has requested.
@@ -64,6 +65,7 @@ class ApiPageSet extends ApiBase {
        private $mMissingPageIDs = [];
        private $mRedirectTitles = [];
        private $mSpecialTitles = [];
+       private $mAllSpecials = []; // separate from mAllPages to avoid breaking getAllTitlesByNamespace()
        private $mNormalizedTitles = [];
        private $mInterwikiTitles = [];
        /** @var Title[] */
@@ -1061,7 +1063,7 @@ class ApiPageSet extends ApiBase {
         * @return LinkBatch
         */
        private function getRedirectTargets() {
-               $lb = new LinkBatch();
+               $titlesToResolve = [];
                $db = $this->getDB();
 
                $res = $db->select(
@@ -1088,8 +1090,8 @@ class ApiPageSet extends ApiBase {
                        unset( $this->mPendingRedirectIDs[$rdfrom] );
                        if ( $to->isExternal() ) {
                                $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
-                       } elseif ( !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
-                               $lb->add( $row->rd_namespace, $row->rd_title );
+                       } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
+                               $titlesToResolve[] = $to;
                        }
                        $this->mRedirectTitles[$from] = $to;
                }
@@ -1104,7 +1106,11 @@ class ApiPageSet extends ApiBase {
                                        // What the hell. Let's just ignore this
                                        continue;
                                }
-                               $lb->addObj( $rt );
+                               if ( $rt->isExternal() ) {
+                                       $this->mInterwikiTitles[$rt->getPrefixedText()] = $rt->getInterwiki();
+                               } elseif ( !isset( $this->mAllPages[$rt->getNamespace()][$rt->getDBkey()] ) ) {
+                                       $titlesToResolve[] = $rt;
+                               }
                                $from = $title->getPrefixedText();
                                $this->mResolvedRedirectTitles[$from] = $title;
                                $this->mRedirectTitles[$from] = $rt;
@@ -1112,7 +1118,7 @@ class ApiPageSet extends ApiBase {
                        }
                }
 
-               return $lb;
+               return $this->processTitlesArray( $titlesToResolve );
        }
 
        /**
@@ -1151,12 +1157,14 @@ class ApiPageSet extends ApiBase {
                                        $titleObj = Title::newFromTextThrow( $title, $this->mDefaultNamespace );
                                } catch ( MalformedTitleException $ex ) {
                                        // Handle invalid titles gracefully
-                                       $this->mAllPages[0][$title] = $this->mFakePageId;
-                                       $this->mInvalidTitles[$this->mFakePageId] = [
-                                               'title' => $title,
-                                               'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
-                                       ];
-                                       $this->mFakePageId--;
+                                       if ( !isset( $this->mAllPages[0][$title] ) ) {
+                                               $this->mAllPages[0][$title] = $this->mFakePageId;
+                                               $this->mInvalidTitles[$this->mFakePageId] = [
+                                                       'title' => $title,
+                                                       'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
+                                               ];
+                                               $this->mFakePageId--;
+                                       }
                                        continue; // There's nothing else we can do
                                }
                        } else {
@@ -1184,8 +1192,13 @@ class ApiPageSet extends ApiBase {
                                if ( $titleObj->getNamespace() < 0 ) {
                                        // Handle Special and Media pages
                                        $titleObj = $titleObj->fixSpecialName();
-                                       $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
-                                       $this->mFakePageId--;
+                                       $ns = $titleObj->getNamespace();
+                                       $dbkey = $titleObj->getDBkey();
+                                       if ( !isset( $this->mAllSpecials[$ns][$dbkey] ) ) {
+                                               $this->mAllSpecials[$ns][$dbkey] = $this->mFakePageId;
+                                               $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
+                                               $this->mFakePageId--;
+                                       }
                                } else {
                                        // Regular page
                                        $linkBatch->addObj( $titleObj );
@@ -1384,7 +1397,7 @@ class ApiPageSet extends ApiBase {
         * @return array
         */
        private static function getPositiveIntegers( $array ) {
-               // bug 25734 API: possible issue with revids validation
+               // T27734 API: possible issue with revids validation
                // It seems with a load of revision rows, MySQL gets upset
                // Remove any < 0 integers, as they can't be valid
                foreach ( $array as $i => $int ) {
index 46ba34b..67983e7 100644 (file)
@@ -426,6 +426,15 @@ class ApiParamInfo extends ApiBase {
                                        ( is_array( $item['type'] ) || $item['type'] === 'namespace' ) ) {
                                        $item['allspecifier'] = $allSpecifier;
                                }
+
+                               if ( $item['type'] === 'namespace' &&
+                                       isset( $settings[ApiBase::PARAM_EXTRA_NAMESPACES] ) &&
+                                       is_array( $settings[ApiBase::PARAM_EXTRA_NAMESPACES] )
+                               ) {
+                                       $item['extranamespaces'] = $settings[ApiBase::PARAM_EXTRA_NAMESPACES];
+                                       ApiResult::setArrayType( $item['extranamespaces'], 'array' );
+                                       ApiResult::setIndexedTagName( $item['extranamespaces'], 'ns' );
+                               }
                        }
                        if ( isset( $settings[ApiBase::PARAM_MAX] ) ) {
                                $item['max'] = $settings[ApiBase::PARAM_MAX];
index 746dc9a..c74f890 100644 (file)
@@ -29,8 +29,6 @@
  */
 class ApiProtect extends ApiBase {
        public function execute() {
-               global $wgContLang;
-
                $params = $this->extractRequestParams();
 
                $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
@@ -101,7 +99,7 @@ class ApiProtect extends ApiBase {
                        }
                        $resultProtections[] = [
                                $p[0] => $protections[$p[0]],
-                               'expiry' => $wgContLang->formatExpiry( $expiryarray[$p[0]], TS_ISO_8601, 'infinite' ),
+                               'expiry' => ApiResult::formatExpiry( $expiryarray[$p[0]], 'infinite' ),
                        ];
                }
 
index 324d030..3124638 100644 (file)
@@ -37,11 +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->addDeprecation( 'apiwarn-deprecation-purge-get', 'purge-via-GET' );
-               }
-
                $params = $this->extractRequestParams();
 
                $continuationManager = new ApiContinuationManager( $this, [], [] );
@@ -60,12 +55,8 @@ 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 {
                                $this->addWarning( 'apierror-ratelimited' );
@@ -157,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 b09b977..020df6d 100644 (file)
@@ -230,7 +230,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                }
 
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
-                       // Paranoia: avoid brute force searches (bug 17342)
+                       // Paranoia: avoid brute force searches (T19342)
                        // (shouldn't be able to get here without 'deletedhistory', but
                        // check it again just in case)
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
index e3e5ed6..ef6bb6a 100644 (file)
@@ -197,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' );
index c3636c6..3b24e37 100644 (file)
@@ -263,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 b64b2c8..7b43efc 100644 (file)
@@ -131,7 +131,7 @@ class ApiQueryAllRevisions extends ApiQueryRevisionsBase {
                }
 
                if ( $params['user'] !== null || $params['excludeuser'] !== null ) {
-                       // Paranoia: avoid brute force searches (bug 17342)
+                       // Paranoia: avoid brute force searches (T19342)
                        if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
                                $bitmask = Revision::DELETED_USER;
                        } elseif ( !$this->getUser()->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
index 2e2ac32..9e7ad67 100644 (file)
@@ -116,8 +116,18 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        // 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'] );
                }
 
@@ -135,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' );
                }
@@ -148,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() )
+                               ] )
                        ] );
                }
 
@@ -166,7 +186,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                ],
                        ] ] );
 
-                       // Actually count the actions using a subquery (bug 64505 and bug 64507)
+                       // Actually count the actions using a subquery (T66505 and T66507)
                        $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $activeUserSeconds );
                        $this->addFields( [
                                'recentactions' => '(' . $db->selectSQLText(
index 4c32320..b3ac606 100644 (file)
@@ -152,7 +152,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                if ( $this->params['filterredir'] == 'redirects' ) {
                        $this->addWhereFld( 'page_is_redirect', 1 );
                } elseif ( $this->params['filterredir'] == 'nonredirects' && !$this->redirect ) {
-                       // bug 22245 - Check for !redirect, as filtering nonredirects, when
+                       // T24245 - Check for !redirect, as filtering nonredirects, when
                        // getting what links to them is contradictory
                        $this->addWhereFld( 'page_is_redirect', 0 );
                }
@@ -344,7 +344,7 @@ 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 ) {
index ef7b9af..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 ) {
index 281fb61..87bb6a7 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * This is a base class for all Query modules.
  * It provides some common functionality such as constructing various SQL
@@ -258,7 +260,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 +327,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 ) ) {
index ef79efd..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' );
@@ -204,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;
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 d0b8214..471aed6 100644 (file)
@@ -123,7 +123,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
                }
 
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
-                       // Paranoia: avoid brute force searches (bug 17342)
+                       // Paranoia: avoid brute force searches (T19342)
                        // (shouldn't be able to get here without 'deletedhistory', but
                        // check it again just in case)
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
index 6a259cd..2959151 100644 (file)
@@ -203,7 +203,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                }
 
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
-                       // Paranoia: avoid brute force searches (bug 17342)
+                       // Paranoia: avoid brute force searches (T19342)
                        // (shouldn't be able to get here without 'deletedhistory', but
                        // check it again just in case)
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
index c9dae8d..e5e45b3 100644 (file)
@@ -509,7 +509,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                if ( $mto && !$mto->isError() ) {
                                        $vals['thumburl'] = wfExpandUrl( $mto->getUrl(), PROTO_CURRENT );
 
-                                       // bug 23834 - If the URL's are the same, we haven't resized it, so shouldn't give the wanted
+                                       // T25834 - If the URLs are the same, we haven't resized it, so shouldn't give the wanted
                                        // thumbnail sizes for the thumbnail actual size
                                        if ( $mto->getUrl() !== $file->getUrl() ) {
                                                $vals['thumbwidth'] = intval( $mto->getWidth() );
index fd65038..e789dd4 100644 (file)
@@ -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 e9ae132..4556e29 100644 (file)
@@ -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 2dcd0b4..8a13fef 100644 (file)
@@ -198,7 +198,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        $this->addWhere( 'log_title ' . $db->buildLike( $title->getDBkey(), $db->anyString() ) );
                }
 
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                if ( $params['namespace'] !== null || !is_null( $title ) || !is_null( $user ) ) {
                        if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
                                $titleBits = LogPage::DELETED_ACTION;
@@ -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 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 8d14927..26581a6 100644 (file)
@@ -147,7 +147,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                /* Build our basic query. Namely, something along the lines of:
                 * SELECT * FROM recentchanges WHERE rc_timestamp > $start
-                *              AND rc_timestamp < $end AND rc_namespace = $namespace
+                *   AND rc_timestamp < $end AND rc_namespace = $namespace
                 */
                $this->addTables( 'recentchanges' );
                $this->addTimestampWhereRange( 'rc_timestamp', $params['dir'], $params['start'], $params['end'] );
@@ -320,7 +320,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $this->addWhereFld( 'ct_tag', $params['tag'] );
                }
 
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
                                $bitmask = Revision::DELETED_USER;
@@ -617,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 48f6046..c47de9d 100644 (file)
@@ -244,7 +244,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                                }
                        }
                        if ( $params['user'] !== null || $params['excludeuser'] !== null ) {
-                               // Paranoia: avoid brute force searches (bug 17342)
+                               // Paranoia: avoid brute force searches (T19342)
                                if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
                                        $bitmask = Revision::DELETED_USER;
                                } elseif ( !$this->getUser()->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
index 6fc6aa3..cc302dc 100644 (file)
@@ -23,6 +23,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * A query action to return meta information about the wiki site.
@@ -87,6 +88,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                case 'languages':
                                        $fit = $this->appendLanguages( $p );
                                        break;
+                               case 'languagevariants':
+                                       $fit = $this->appendLanguageVariants( $p );
+                                       break;
                                case 'skins':
                                        $fit = $this->appendSkins( $p );
                                        break;
@@ -388,7 +392,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 = [];
@@ -712,6 +716,49 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
+       // Export information about which page languages will trigger
+       // language conversion. (T153341)
+       public function appendLanguageVariants( $property ) {
+               $langNames = LanguageConverter::$languagesWithVariants;
+               if ( $this->getConfig()->get( 'DisableLangConversion' ) ) {
+                       // Ensure result is empty if language conversion is disabled.
+                       $langNames = [];
+               }
+               sort( $langNames );
+
+               $data = [];
+               foreach ( $langNames as $langCode ) {
+                       $lang = Language::factory( $langCode );
+                       if ( $lang->getConverter() instanceof FakeConverter ) {
+                               // Only languages which do not return instances of
+                               // FakeConverter implement language conversion.
+                               continue;
+                       }
+                       $data[$langCode] = [];
+                       ApiResult::setIndexedTagName( $data[$langCode], 'variant' );
+                       ApiResult::setArrayType( $data[$langCode], 'kvp', 'code' );
+
+                       $variants = $lang->getVariants();
+                       sort( $variants );
+                       foreach ( $variants as $v ) {
+                               $fallbacks = $lang->getConverter()->getVariantFallbacks( $v );
+                               if ( !is_array( $fallbacks ) ) {
+                                       $fallbacks = [ $fallbacks ];
+                               }
+                               $data[$langCode][$v] = [
+                                       'fallbacks' => $fallbacks,
+                               ];
+                               ApiResult::setIndexedTagName(
+                                       $data[$langCode][$v]['fallbacks'], 'variant'
+                               );
+                       }
+               }
+               ApiResult::setIndexedTagName( $data, 'lang' );
+               ApiResult::setArrayType( $data, 'kvp', 'code' );
+
+               return $this->getResult()->addValue( 'query', $property, $data );
+       }
+
        public function appendSkins( $property ) {
                $data = [];
                $allowed = Skin::getAllowedSkins();
@@ -771,7 +818,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        public function appendProtocols( $property ) {
-               // Make a copy of the global so we don't try to set the _element key of it - bug 45130
+               // Make a copy of the global so we don't try to set the _element key of it - T47130
                $protocols = array_values( $this->getConfig()->get( 'UrlProtocols' ) );
                ApiResult::setArrayType( $protocols, 'BCarray' );
                ApiResult::setIndexedTagName( $protocols, 'p' );
@@ -850,6 +897,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        'rightsinfo',
                                        'restrictions',
                                        'languages',
+                                       'languagevariants',
                                        'skins',
                                        'extensiontags',
                                        'functionhooks',
index b6d871b..31a9238 100644 (file)
@@ -65,18 +65,36 @@ 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'] ) ) {
                                $encParamName = $this->encodeParamName( 'user' );
                                $this->dieWithError(
@@ -84,7 +102,7 @@ class ApiQueryContributions extends ApiQueryBase {
                                );
                        }
                        foreach ( $this->params['user'] as $u ) {
-                               if ( is_null( $u ) || $u === '' ) {
+                               if ( $u === '' ) {
                                        $encParamName = $this->encodeParamName( 'user' );
                                        $this->dieWithError(
                                                [ 'apierror-paramempty', $encParamName ], "paramempty_$encParamName"
@@ -495,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 60e122c..04b0fac 100644 (file)
@@ -67,16 +67,13 @@ class ApiQueryUserInfo extends ApiQueryBase {
         *  - 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();
                }
@@ -146,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
@@ -305,6 +315,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                        'blockinfo',
                                        'hasmsg',
                                        'groups',
+                                       'groupmemberships',
                                        'implicitgroups',
                                        'rights',
                                        'changeablegroups',
index 2d620a4..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,6 +98,8 @@ class ApiQueryUsers extends ApiQueryBase {
        }
 
        public function execute() {
+               $db = $this->getDB();
+
                $params = $this->extractRequestParams();
                $this->requireMaxOneParameter( $params, 'userids', 'users' );
 
@@ -167,11 +170,16 @@ class ApiQueryUsers extends ApiQueryBase {
 
                                $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;
                                }
                        }
 
@@ -207,6 +215,15 @@ class ApiQueryUsers extends ApiQueryBase {
                                        $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[$key]['implicitgroups'] = $user->getAutomaticGroups();
                                }
@@ -303,6 +320,10 @@ class ApiQueryUsers extends ApiQueryBase {
                                        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' );
@@ -347,6 +368,7 @@ class ApiQueryUsers extends ApiQueryBase {
                                ApiBase::PARAM_TYPE => [
                                        'blockinfo',
                                        'groups',
+                                       'groupmemberships',
                                        'implicitgroups',
                                        'rights',
                                        'editcount',
index 61a4394..6734740 100644 (file)
@@ -364,7 +364,7 @@ class ApiResult implements ApiSerializable {
                        }
                }
                if ( is_array( $value ) ) {
-                       // Work around PHP bug 45959 by copying to a temporary
+                       // Work around https://bugs.php.net/bug.php?id=45959 by copying to a temporary
                        // (in this case, foreach gets $k === "1" but $tmp[$k] assigns as if $k === 1)
                        $tmp = [];
                        foreach ( $value as $k => $v ) {
@@ -1196,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 3f03c02..3ff99f1 100755 (executable)
@@ -84,6 +84,7 @@ class ApiSetPageLanguage extends ApiBase {
                        $this,
                        $titleObj,
                        $params['lang'],
+                       $params['reason'] === null ? '' : $params['reason'],
                        $params['tags'] ?: []
                );
 
@@ -121,6 +122,7 @@ class ApiSetPageLanguage extends ApiBase {
                                ),
                                ApiBase::PARAM_REQUIRED => true,
                        ],
+                       'reason' => null,
                        'tags' => [
                                ApiBase::PARAM_TYPE => 'tags',
                                ApiBase::PARAM_ISMULTI => true,
index 3eeb7a4..bfb0324 100644 (file)
@@ -44,7 +44,7 @@ class ApiUnblock extends ApiBase {
                if ( !$user->isAllowed( 'block' ) ) {
                        $this->dieWithError( 'apierror-permissiondenied-unblock', 'permissiondenied' );
                }
-               # bug 15810: blocked admins should have limited access here
+               # T17810: blocked admins should have limited access here
                if ( $user->isBlocked() ) {
                        $status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
                        if ( $status !== true ) {
index f821374..af3fff6 100644 (file)
@@ -494,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'],
@@ -637,7 +644,8 @@ class ApiUpload extends ApiBase {
                                break;
 
                        case UploadBase::HOOK_ABORTED:
-                               $this->dieWithError( $params, 'hookaborted', [ 'details' => $verification['error'] ] );
+                               $msg = $verification['error'] === '' ? 'hookaborted' : $verification['error'];
+                               $this->dieWithError( $msg, 'hookaborted', [ 'details' => $verification['error'] ] );
                                break;
                        default:
                                $this->dieWithError( 'apierror-unknownerror-nocode', 'unknown-error',
index 4ef974c..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,6 +57,41 @@ 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'];
@@ -76,8 +109,8 @@ class ApiUserrights extends ApiBase {
                $r['user'] = $user->getName();
                $r['userid'] = $user->getId();
                list( $r['added'], $r['removed'] ) = $form->doSaveUserGroups(
-                       $user, (array)$params['add'],
-                       (array)$params['remove'], $params['reason'], $tags
+                       $user, (array)$params['add'], (array)$params['remove'],
+                       $params['reason'], $tags, $groupExpiries
                );
 
                $result = $this->getResult();
@@ -120,7 +153,7 @@ class ApiUserrights extends ApiBase {
        }
 
        public function getAllowedParams() {
-               return [
+               $a = [
                        'user' => [
                                ApiBase::PARAM_TYPE => 'user',
                        ],
@@ -131,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
@@ -147,6 +185,10 @@ class ApiUserrights extends ApiBase {
                                ApiBase::PARAM_ISMULTI => true
                        ],
                ];
+               if ( !$this->getUserRightsPage()->canProcessExpiries() ) {
+                       unset( $a['expiry'] );
+               }
+               return $a;
        }
 
        public function needsToken() {
@@ -158,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() {
index 86078d4..1222195 100644 (file)
@@ -8,7 +8,8 @@
                        "Hiba Alshawi",
                        "Maroen1990",
                        "محمد أحمد عبد الفتاح",
-                       "ديفيد"
+                       "ديفيد",
+                       "ASHmed"
                ]
        },
        "apihelp-main-param-action": "أي فعل للعمل.",
        "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>.",
index d26d1d4..fe93ebe 100644 (file)
@@ -22,5 +22,7 @@
        "apihelp-edit-example-edit": "একটি পাতা সম্পাদনা করুন",
        "apihelp-edit-example-prepend": "একটি পৃষ্ঠার পূর্বে <kbd>_&#95;NOTOC_&#95;</kbd> লিখুন।",
        "apihelp-login-example-login": "প্রবেশ",
+       "apihelp-setpagelanguage-param-reason": "পরিবর্তনের কারণ।",
+       "apierror-invaliduserid": "ব্যবহারকারী আইডি <var>$1</var> বৈধ নয়।",
        "apierror-nosuchuserid": "$1 আইডি যুক্ত কোন ব্যবহারকারী নেই।"
 }
index 72933fe..a8f4dd8 100644 (file)
@@ -30,5 +30,6 @@
        "apihelp-login-example-login": "Kevreañ.",
        "apihelp-move-description": "Dilec'hiañ ur bajenn.",
        "apihelp-move-param-noredirect": "Chom hep krouiñ un adkas.",
-       "apihelp-protect-example-protect": "Gwareziñ ur bajenn."
+       "apihelp-protect-example-protect": "Gwareziñ ur bajenn.",
+       "apihelp-rollback-param-tags": "Tikedennoù da lakaat e talvoud war an distroioù."
 }
index e8fd165..ca1e85a 100644 (file)
        "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 rozsah IP adres k odblokování. Nelze použít dohromady s <var>$1id</var> nebo <var>$luserid</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.",
index 6c3c8e9..491a1b0 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-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-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.",
@@ -55,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+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+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+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-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.",
        "apihelp-query+search-example-simple": "Nach <kbd>meaning</kbd> suchen.",
        "apihelp-query+search-example-text": "Texte nach <kbd>meaning</kbd> durchsuchen.",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Gibt eine Liste für die Sprachcodes zurück, bei denen der [[mw:LanguageConverter|Sprachkonverter]] aktiviert ist und die unterstützten Varianten für jede Sprache.",
        "apihelp-query+siteinfo-example-simple": "Websiteinformationen abrufen",
+       "apihelp-query+stashimageinfo-param-sessionkey": "Alias für $1filekey, für die Rückwärtskompatibilität.",
+       "apihelp-query+stashimageinfo-example-simple": "Gibt Informationen für eine gespeicherte Datei zurück.",
+       "apihelp-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-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 die API zu verwenden.",
+       "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-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-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-xml-param-includexmlnamespace": "Falls angegeben, ergänzt einen XML-Namensraum.",
        "apihelp-xmlfm-description": "Daten im XML-Format ausgeben (schöngedruckt in HTML).",
        "api-format-title": "MediaWiki-API-Ergebnis",
-       "api-format-prettyprint-header": "Dies ist die HTML-Repräsentation des $1-Formats. HTML ist zur Fehlerbehebung gut, aber unpassend für den Anwendungsgebrauch.\n\nGib den Parameter <var>format</var> an, um das Ausgabeformat zu ändern. Um die Nicht-HTML-Repräsentation des $1-Formats anzusehen, lege <kbd>format=$2</kbd> fest.\n\nSiehe die [[mw:API|vollständige Dokumentation]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.",
+       "api-format-prettyprint-header": "Dies ist die Darstellung des $1-Formats in HTML. HTML ist gut zur Fehlerbehebung geeignet, aber unpassend für die Nutzung durch Anwendungen.\n\nGib den Parameter <var>format</var> an, um das Ausgabeformat zu ändern. Lege <kbd>format=$2</kbd> fest, um die von HTML abweichende Darstellung des $1-Formats zu erhalten.\n\nSiehe auch die [[mw:API|vollständige Dokumentation der API]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.",
        "api-format-prettyprint-status": "Diese Antwort wird mit dem HTTP-Status $1 $2 zurückgegeben.",
        "api-pageset-param-titles": "Eine Liste der Titel, an denen gearbeitet werden soll.",
        "api-pageset-param-pageids": "Eine Liste der Seitenkennungen, an denen gearbeitet werden soll.",
        "api-help-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 9915d39..ab8a8a5 100644 (file)
@@ -37,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-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+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 evaluting the [[MediaWiki:Bad image list]]",
+       "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+siteinfo-paramvalue-prop-rightsinfo": "Returns wiki rights (license) information if available.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Returns information on available restriction (protection) types.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Returns a list of languages MediaWiki supports (optionally localised by using <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Returns a list of language codes for which [[mw:LanguageConverter|LanguageConverter]] is enabled, and the variants supported for each.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Returns a list of all enabled skins (optionally localised by using <var>$1inlanguagecode</var>, otherwise in the content language).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Returns a list of parser extension tags.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Returns a list of parser function hooks.",
        "apihelp-query+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-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-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> or <var>$luserid</var>.",
-       "apihelp-unblock-param-user": "Username, IP address or IP address range to unblock. Cannot be used together with <var>$1id</var> or <var>$luserid</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.",
        "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-invalidexpiry": "Invalid expiry time \"$1\".",
        "apierror-invalid-file-key": "Not a valid file key.",
        "apierror-invalidlang": "Invalid language code for parameter <var>$1</var>.",
-       "apierror-invalidoldimage": "The oldimage parameter has invalid format.",
+       "apierror-invalidoldimage": "The <var>oldimage</var> parameter has an invalid format.",
        "apierror-invalidparammix-cannotusewith": "The <kbd>$1</kbd> parameter cannot be used with <kbd>$2</kbd>.",
        "apierror-invalidparammix-mustusewith": "The <kbd>$1</kbd> parameter may only be used with <kbd>$2</kbd>.",
        "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> cannot be combined with the <var>oldid</var>, <var>pageid</var> or <var>page</var> parameters. Please use <var>title</var> and <var>text</var>.",
        "apierror-invalidparammix": "The {{PLURAL:$2|parameters}} $1 can not be used together.",
-       "apierror-invalidsection": "The section parameter must be a valid section ID or <kbd>new</kbd>.",
+       "apierror-invalidsection": "The <var>section</var> parameter must be a valid section ID or <kbd>new</kbd>.",
        "apierror-invalidsha1base36hash": "The SHA1Base36 hash provided is not valid.",
        "apierror-invalidsha1hash": "The SHA1 hash provided is not valid.",
        "apierror-invalidtitle": "Bad title \"$1\".",
        "apierror-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.",
        "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-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-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).",
 
        "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 d258586..a2fbb48 100644 (file)
@@ -45,6 +45,8 @@
        "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": "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>.",
@@ -58,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.",
@@ -71,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.",
@@ -80,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-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-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-example-protect": "Proteger una página",
        "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-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+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+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+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-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-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+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-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-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+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-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-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-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+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+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+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-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-param-generaterevisions": "Cuando se utilice como generador, genera identificadores de revisión en lugar de títulos. Las entradas en la lista de cambios recientes que no tengan identificador de revisión asociado (por ejemplo, la mayoría de las entradas de registro) no generarán nada.",
        "apihelp-query+recentchanges-example-simple": "Lista de cambios recientes.",
+       "apihelp-query+recentchanges-example-generator": "Obtener información de página de cambios recientes no patrullados.",
        "apihelp-query+redirects-description": "Devuelve todas las redirecciones a las páginas dadas.",
        "apihelp-query+redirects-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+redirects-paramvalue-prop-pageid": "Identificador de página 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+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+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-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-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-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 la API.",
+       "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> o <var>$luserid</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-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-header-only-html": "Esta es una representación en HTML destinada a la depuración, y no es adecuada para el uso de la aplicación.\n\nVéase la [[mw:API|documentación completa]] o la [[Special:ApiHelp/main|página de ayuda de la API]] para más información.",
        "api-format-prettyprint-status": "Esta respuesta se devolvería con el estado HTTP $1 $2.",
+       "api-pageset-param-titles": "Una lista de títulos en los que trabajar.",
+       "api-pageset-param-pageids": "Una lista de identificadores de páginas en las que trabajar.",
+       "api-pageset-param-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-pageset-param-converttitles": "Convertir los títulos a otras variantes, si es necesario. Solo funciona si el idioma del contenido del wiki admite la conversión entre variantes. La conversión entre variantes está habilitada en idiomas tales como $1.",
        "api-help-title": "Ayuda de la API de MediaWiki",
        "api-help-lead": "Esta es una página de documentación autogenerada de la API de MediaWiki.\n\nDocumentación y ejemplos: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Módulo principal",
        "api-help-param-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-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-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-contenttoobig": "El contenido que has suministrado supera el tamaño máximo de archivo de $1 {{PLURAL:$1|kilobytes|kilobytes}}.",
+       "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-invalidsection": "El parámetro <var>section</var> debe ser un identificador de sección válido, o bien <kbd>new</kbd>.",
        "apierror-invalidsha1base36hash": "El hash SHA1Base36 proporcionado no es válido.",
        "apierror-invalidsha1hash": "El hash SHA1 proporcionado no es válido.",
        "apierror-invalidtitle": "Título incorrecto \"$1\".",
+       "apierror-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>).",
index a251645..cfb1db8 100644 (file)
@@ -60,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-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-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-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 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-param-exportnowrap": "Renvoyer le XML exporté sans l’inclure dans un résultat XML (même format que [[Special:Export]]). Utilisable uniquement avec $1export.",
        "apihelp-query-param-iwurl": "S’il faut obtenir l’URL complète si le titre est un lien interwiki.",
        "apihelp-query-param-rawcontinue": "Renvoyer les données <samp>query-continue</samp> brutes pour continuer.",
-       "apihelp-query-example-revisions": "Récupérer [[Special:ApiHelp/query+siteinfo|l’info du site]] et [[Special:ApiHelp/query+revisions|les révisions]] de <kbd>Page principale</kbd>.",
+       "apihelp-query-example-revisions": "Récupérer [[Special:ApiHelp/query+siteinfo|l’info du site]] et [[Special:ApiHelp/query+revisions|les révisions]] de <kbd>Main Page</kbd>.",
        "apihelp-query-example-allpages": "Récupérer les révisions des pages commençant par <kbd>API/</kbd>.",
        "apihelp-query+allcategories-description": "Énumérer toutes les catégories.",
        "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 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+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-param-namespace": "Lister uniquement les pages dans cet espace de noms.",
        "apihelp-query+deletedrevs-param-limit": "Le nombre maximal de révisions à lister.",
        "apihelp-query+deletedrevs-param-prop": "Quelles propriétés obtenir :\n;revid:Ajoute l’ID de la révision supprimée.\n;parentid:Ajoute l’ID de la révision précédente de la page.\n;user:Ajoute l’utilisateur ayant fait la révision.\n;userid:Ajoute l’ID de l’utilisateur qui a fait la révision.\n;comment:Ajoute le commentaire de la révision.\n;parsedcomment:Ajoute le commentaire analysé de la révision.\n;minor:Marque si la révision est mineure.\n;len:Ajoute la longueur (en octets) de la révision.\n;sha1:Ajoute le SHA-1 (base 16) de la révision.\n;content:Ajoute le contenu de la révision.\n;token:<span class=\"apihelp-deprecated\">Obsolète.</span> Fournit le jeton de modification.\n;tags:Balises pour la révision.",
-       "apihelp-query+deletedrevs-example-mode1": "Lister les dernières révisions supprimées de des pages <kbd>Main Page</kbd> et <kbd>Talk:Main Page</kbd>, avec le contenu (mode 1).",
+       "apihelp-query+deletedrevs-example-mode1": "Lister les dernières révisions supprimées des pages <kbd>Main Page</kbd> et <kbd>Talk:Main Page</kbd>, avec le contenu (mode 1).",
        "apihelp-query+deletedrevs-example-mode2": "Lister les 50 dernières contributions de <kbd>Bob</kbd> supprimées (mode 2).",
        "apihelp-query+deletedrevs-example-mode3-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal (mode 3)",
        "apihelp-query+deletedrevs-example-mode3-talk": "Lister les 50 premières pages supprimées dans l’espace de noms {{ns:talk}} (mode 3).",
        "apihelp-query+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-bitdepth": "Ajoute la profondeur de bits de la version.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Utilisé par la page Special:Upload pour obtenir de l’information sur un fichier existant. Non prévu pour être utilisé en dehors du cœur de MédiaWiki.",
        "apihelp-query+imageinfo-paramvalue-prop-badfile": "Ajoute l'indication que le fichier est sur [[MediaWiki:Bad image list]]",
-       "apihelp-query+imageinfo-param-limit": "Combien de révision de fichier renvoyer par fichier.",
+       "apihelp-query+imageinfo-param-limit": "Combien de révisions de fichier renvoyer par fichier.",
        "apihelp-query+imageinfo-param-start": "Horodatage auquel démarrer la liste.",
        "apihelp-query+imageinfo-param-end": "Horodatage auquel arrêter la liste.",
        "apihelp-query+imageinfo-param-urlwidth": "Si $2prop=url est défini, une URL vers une image à l’échelle de cette largeur sera renvoyée.\nPour des raisons de performance si cette option est utilisée, pas plus de $1 images mises à l’échelle seront renvoyées.",
        "apihelp-query+imageinfo-param-extmetadatalanguage": "Quelle langue pour analyser extmetadata. Cela affecte à la fois quelle traduction analyser, s’il y en a plusieurs, et comment les choses comme les nombres et d’autres valeurs sont mises en forme.",
        "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-urlparam": "Une chaîne de paramètres 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+info-param-testactions": "Tester si l’utilisateur actuel peut effectuer certaines actions sur la page.",
        "apihelp-query+info-param-token": "Utiliser plutôt [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-query+info-example-simple": "Obtenir des informations sur la page <kbd>Main Page</kbd>.",
-       "apihelp-query+info-example-protection": "Obtenir des informations générale et de protection sur la page <kbd>Main Page</kbd>.",
-       "apihelp-query+iwbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien interwiki indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un préfixe, ou tous les liens vers un titre (avec un préfixe donné). N’utiliser aucun paramètre revient en pratique à « tous les liens interwiki ».",
+       "apihelp-query+info-example-protection": "Obtenir des informations générales et de protection sur la page <kbd>Main Page</kbd>.",
+       "apihelp-query+iwbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien interwiki indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un préfixe, ou tous les liens vers un titre (avec un préfixe donné). Sans paramètre, équivaut à « tous les liens interwiki ».",
        "apihelp-query+iwbacklinks-param-prefix": "Préfixe pour l’interwiki.",
        "apihelp-query+iwbacklinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "Combien de pages renvoyer.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Ajoute le préfixe de l’interwiki.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Ajoute le titre de l’interwiki.",
        "apihelp-query+iwbacklinks-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+iwbacklinks-example-simple": "Obtenir les pages ayant un lien vers [[wikibooks:Test]]",
-       "apihelp-query+iwbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[wikibooks:Test]]",
+       "apihelp-query+iwbacklinks-example-simple": "Obtenir les pages qui ont un lien vers [[wikibooks:Test]].",
+       "apihelp-query+iwbacklinks-example-generator": "Obtenir des informations sur les pages qui ont un lien vers [[wikibooks:Test]].",
        "apihelp-query+iwlinks-description": "Renvoie tous les liens interwiki des pages indiquées.",
-       "apihelp-query+iwlinks-param-url": "S&il faut obtenir l’URL complète (impossible à utiliser avec $1prop).",
+       "apihelp-query+iwlinks-param-url": "S'il faut obtenir l’URL complète (impossible à utiliser avec $1prop).",
        "apihelp-query+iwlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Ajoute l’URL complète.",
        "apihelp-query+iwlinks-param-limit": "Combien de liens interwiki renvoyer.",
        "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Ajoute le code de langue du lien de langue.",
        "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Ajoute le titre du lien de langue.",
        "apihelp-query+langbacklinks-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+langbacklinks-example-simple": "Obtenir les pages avec un lien avec [[:fr:Test]]",
-       "apihelp-query+langbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[:fr:Test]]",
+       "apihelp-query+langbacklinks-example-simple": "Obtenir les pages ayant un lien vers [[:fr:Test]].",
+       "apihelp-query+langbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[:fr:Test]].",
        "apihelp-query+langlinks-description": "Renvoie tous les liens interlangue des pages fournies.",
        "apihelp-query+langlinks-param-limit": "Combien de liens interlangue renvoyer.",
        "apihelp-query+langlinks-param-url": "S’il faut récupérer l’URL complète (impossible à utiliser avec <var>$1prop</var>).",
        "apihelp-query+langlinks-param-inlanguagecode": "Code de langue pour les noms de langue localisés.",
        "apihelp-query+langlinks-example-simple": "Obtenir les liens interlangue de la page <kbd>Main Page</kbd>.",
        "apihelp-query+links-description": "Renvoie tous les liens des pages fournies.",
-       "apihelp-query+links-param-namespace": "Afficher les liens uniquement dans ces espaces de nom.",
+       "apihelp-query+links-param-namespace": "Afficher les liens uniquement dans ces espaces de noms.",
        "apihelp-query+links-param-limit": "Combien de liens renvoyer.",
        "apihelp-query+links-param-titles": "Lister uniquement les liens vers ces titres. Utile pour vérifier si une certaine page a un lien vers un titre donné.",
        "apihelp-query+links-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+links-example-simple": "Obtenir les liens de la page <kbd>Main Page</kbd>",
        "apihelp-query+links-example-generator": "Obtenir des informations sur tous les liens de page dans <kbd>Main Page</kbd>.",
-       "apihelp-query+links-example-namespaces": "Obtenir les liens de la page <kbd>Accueil</kbd> dans les espaces de nom {{ns:user}} et {{ns:template}}.",
+       "apihelp-query+links-example-namespaces": "Obtenir les liens de la page <kbd>Main Page</kbd> dans les espaces de nom {{ns:user}} et {{ns:template}}.",
        "apihelp-query+linkshere-description": "Trouver toutes les pages ayant un lien vers les pages données.",
        "apihelp-query+linkshere-param-prop": "Quelles propriétés obtenir :",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "ID de chaque page.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Titre de chaque page.",
        "apihelp-query+linkshere-paramvalue-prop-redirect": "Indique si la page est une redirection.",
-       "apihelp-query+linkshere-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
+       "apihelp-query+linkshere-param-namespace": "Inclure uniquement les pages dans ces espaces de noms.",
        "apihelp-query+linkshere-param-limit": "Combien de résultats renvoyer.",
        "apihelp-query+linkshere-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.",
        "apihelp-query+linkshere-example-simple": "Obtenir une liste des pages liées à  [[Main Page]]",
        "apihelp-query+logevents-description": "Obtenir des événements des journaux.",
        "apihelp-query+logevents-param-prop": "Quelles propriétés obtenir :",
        "apihelp-query+logevents-paramvalue-prop-ids": "Ajoute l’ID de l’événement.",
-       "apihelp-query+logevents-paramvalue-prop-title": "Ajoute le titre de la page pour l’événement.",
-       "apihelp-query+logevents-paramvalue-prop-type": "Ajoute le type de l’événement.",
+       "apihelp-query+logevents-paramvalue-prop-title": "Ajoute le titre de la page pour l’événement enregistré.",
+       "apihelp-query+logevents-paramvalue-prop-type": "Ajoute le type de l’événement enregistré.",
        "apihelp-query+logevents-paramvalue-prop-user": "Ajoute l’utilisateur responsable de l’événement.",
        "apihelp-query+logevents-paramvalue-prop-userid": "Ajoute l’ID de l’utilisateur responsable de l’événement.",
        "apihelp-query+logevents-paramvalue-prop-timestamp": "Ajoute l’horodatage de l’événement.",
        "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Ajoute le commentaire analysé de l’événement.",
        "apihelp-query+logevents-paramvalue-prop-details": "Liste les détails supplémentaires sur l’événement.",
        "apihelp-query+logevents-paramvalue-prop-tags": "Liste les balises de l’événement.",
-       "apihelp-query+logevents-param-type": "Filtrer les entrées du journal à ce seul type.",
-       "apihelp-query+logevents-param-action": "Filtrer les actions du journal à cette seule action. Écrase <var>$1type</var>. La présence d'une valeur avec un astérisque dans la liste, comme <var>$1type</var>, indique qu'une chaîne arbitraire peut être passée dans dans la requête à la place de l'astérisque.",
+       "apihelp-query+logevents-param-type": "Filtrer les entrées du journal sur ce seul type.",
+       "apihelp-query+logevents-param-action": "Filtrer les actions du journal sur cette seule action. Écrase <var>$1type</var>. Dans le liste des valeurs possibles, les valeurs suivies d'un astérisque, comme <kbd>action/*</kbd>, peuvent avoir différentes chaînes à la place du slash.",
        "apihelp-query+logevents-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+logevents-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-query+logevents-param-user": "Restreindre aux entrées générées par l’utilisateur spécifié.",
        "apihelp-query+logevents-param-title": "Restreindre aux entrées associées à une page donnée.",
-       "apihelp-query+logevents-param-namespace": "Restreindre aux entrées dans l’espace de nom spécifié.",
+       "apihelp-query+logevents-param-namespace": "Restreindre aux entrées dans l’espace de noms spécifié.",
        "apihelp-query+logevents-param-prefix": "Restreindre aux entrées commençant par ce préfixe.",
        "apihelp-query+logevents-param-tag": "Lister seulement les entrées ayant cette balise.",
        "apihelp-query+logevents-param-limit": "Combien d'entrées renvoyer au total.",
        "apihelp-query+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+revisions+base-param-parse": "Analyser le contenu de la révision (nécessite $1prop=content). Pour des raisons de performance, si cette option est utilisée, $1limit est forcé à 1.",
        "apihelp-query+revisions+base-param-section": "Récupérer uniquement le contenu de ce numéro de section.",
        "apihelp-query+revisions+base-param-diffto": "ID de révision à comparer à chaque révision. Utiliser <kbd>prev</kbd>, <kbd>next</kbd> et <kbd>cur</kbd> pour la version précédente, suivante et actuelle respectivement.",
-       "apihelp-query+revisions+base-param-difftotext": "Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase <var>$1diffto</var>. Si <var>$1section</var> est positionné, seule cette section sera comparée avec ce texte",
+       "apihelp-query+revisions+base-param-difftotext": "Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase <var>$1diffto</var>. Si <var>$1section</var> est positionné, seule cette section sera comparée avec ce texte.",
        "apihelp-query+revisions+base-param-difftotextpst": "Effectuer une transformation avant enregistrement sur le texte avant de le comparer. Valide uniquement quand c’est utilisé avec <var>$1difftotext</var>.",
        "apihelp-query+revisions+base-param-contentformat": "Format de sérialisation utilisé pour <var>$1difftotext</var> et attendu pour la sortie du contenu.",
        "apihelp-query+search-description": "Effectuer une recherche en texte intégral.",
        "apihelp-query+search-param-search": "Rechercher les titres de page ou le contenu correspondant à cette valeur. Vous pouvez utiliser la chaîne de recherche pour invoquer des fonctionnalités de recherche spéciales, selon ce que le serveur de recherche du wiki implémente.",
-       "apihelp-query+search-param-namespace": "Rechercher uniquement dans ces espaces de nom.",
+       "apihelp-query+search-param-namespace": "Rechercher uniquement dans ces espaces de noms.",
        "apihelp-query+search-param-what": "Quel type de recherche effectuer.",
        "apihelp-query+search-param-info": "Quelles métadonnées renvoyer.",
        "apihelp-query+search-param-prop": "Quelles propriétés renvoyer :",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Renvoie l’information sur les droits du wiki (sa licence), si elle est disponible.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Renvoie l’information sur les types de restriction disponibles (protection).",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Renvoie une liste des langues que MédiaWiki prend en charge (éventuellement localisée en utilisant <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Renvoie une liste de codes de langue pour lesquels [[mw:LanguageConverter|LanguageConverter]] est activé, et les variantes supportées pour chacun.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Renvoie une liste de tous les habillages activés (éventuellement localisé en utilisant <var>$1inlanguagecode</var>, sinon dans la langue du contenu).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Renvoie une liste des balises d’extension de l’analyseur.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Renvoie une liste des accroches de fonction de l’analyseur.",
        "apihelp-query+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-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-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 l'API.",
+       "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-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> ou <var>$luserid</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>$luserid</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.",
        "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-invalidexpiry": "Heure d'expiration invalide \"$1\".",
        "apierror-invalid-file-key": "Ne correspond pas à une clé valide de fichier.",
        "apierror-invalidlang": "Code de langue non valide pour le paramètre <var>$1</var>.",
-       "apierror-invalidoldimage": "Le paramètre oldimage a un format non valide.",
+       "apierror-invalidoldimage": "Le paramètre <var>oldimage</var> a un format non valide.",
        "apierror-invalidparammix-cannotusewith": "Le paramètre <kbd>$1</kbd> ne peut pas être utilisé avec <kbd>$2</kbd>.",
        "apierror-invalidparammix-mustusewith": "Le paramètre <kbd>$1</kbd> ne peut être utilisé qu’avec <kbd>$2</kbd>.",
        "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> ne peut pas être combiné avec le paramètre <var>oldid</var>, <var>pageid</var> ou <var>page</var>. Veuillez utiliser <var>title</var> et <var>text</var>.",
        "apierror-invalidparammix": "{{PLURAL:$2|Les paramètres}} $1 ne peuvent pas être utilisés ensemble.",
-       "apierror-invalidsection": "Le paramètre section doit être un ID de section valide ou <kbd>new</kbd>.",
+       "apierror-invalidsection": "Le paramètre <var>section</var> doit être un ID de section valide ou <kbd>new</kbd>.",
        "apierror-invalidsha1base36hash": "Le hachage SHA1Base36 fourni n’est pas valide.",
        "apierror-invalidsha1hash": "Le hachage SHA1 fourni n’est pas valide.",
        "apierror-invalidtitle": "Mauvais titre « $1 ».",
        "apierror-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.",
        "apiwarn-redirectsandrevids": "La résolution de la redirection ne peut pas être utilisée avec le paramètre <var>revids</var>. Toutes les redirections vers lesquelles pointent <var>revids</var> n’ont pas été résolues.",
        "apiwarn-tokennotallowed": "L'action « $1 » n'est pas autorisée pour l'utilisateur actuel.",
        "apiwarn-tokens-origin": "Les jetons ne peuvent pas être obtenus quand la politique de même origine n’est pas appliquée.",
-       "apiwarn-toomanyvalues": "Trop de valeurs fournies pour le paramètre <var>$1</var>: la limite est $2.",
+       "apiwarn-toomanyvalues": "Trop de valeurs fournies pour le paramètre <var>$1</var>. La  limite est $2.",
        "apiwarn-truncatedresult": "Ce résultat a été tronqué parce que sinon, il dépasserait la limite de $1 octets.",
-       "apiwarn-unclearnowtimestamp": "Passer « $2 » comme paramètre d’horodatage <var>$1</var> a été rendu obsolète. Si, pour une raison quelconque, vous avez besoin de spécifier explicitement l’heure courante sans la recalculer du côté client, utilisez <kbd>now<kbd>.",
+       "apiwarn-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-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 9792033..24cb77c 100644 (file)
@@ -29,6 +29,8 @@
        "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. 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>.",
@@ -42,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+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-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.",
        "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-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-invalidexpiry": "Hora de caducidade incorrecta \"$1\".",
        "apierror-invalid-file-key": "Non se corresponde cunha clave válida de ficheiro.",
        "apierror-invalidlang": "Código de lingua incorrecto para o parámetro <var>$1</var>.",
-       "apierror-invalidoldimage": "O parámetro oldimage ten un formato incorrecto.",
+       "apierror-invalidoldimage": "O parámetro <var>oldimage</var> ten un formato incorrecto.",
        "apierror-invalidparammix-cannotusewith": "O parámetro <kbd>$1</kbd> non pode usarse xunto con <kbd>$2</kbd>.",
        "apierror-invalidparammix-mustusewith": "O parámetro <kbd>$1</kbd> só pode usarse xunto con <kbd>$2</kbd>.",
        "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> non se pode combinar cos parámetros <var>oldid</var>, <var>pageid</var> e <var>page</var>. Por favor, utilice <var>title</var> e <var>text</var>.",
        "apierror-invalidparammix": "{{PLURAL:$2|Os parámetros}} $1 non poden usarse xuntos.",
-       "apierror-invalidsection": "O parámetro sección debe ser un ID de sección válido ou <kbd>new</kbd>.",
+       "apierror-invalidsection": "O parámetro <var>section</var> debe ser un ID de sección válido ou <kbd>new</kbd>.",
        "apierror-invalidsha1base36hash": "O código hash SHA1Base36 proporcionado non é correcto.",
        "apierror-invalidsha1hash": "O código hash SHA1 proporcionado non é correcto.",
        "apierror-invalidtitle": "Título incorrecto \"$1\".",
        "apierror-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 (tacaño).",
+       "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",
index dcbeceb..f10334a 100644 (file)
                        "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]].",
@@ -44,6 +47,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": "שינוי נתוני אימות עבור המשתמש הנוכחי.",
@@ -87,7 +91,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+siteinfo-paramvalue-prop-rightsinfo": "החזרת הזכויות (הרישיון) של הוויקי, אם זמין.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "החזרת מידע על ההגבלות (ההגנות) הזמינות.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "החזרת השפות שמדיה־ויקי תומכת בהן (זה יכול להיות מותאם מקומים עם <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "מחזיר רשימת קודי שפה שמופעל עבורם ממיר שפה ([[mw:LanguageConverter|LanguageConverter]]), וההגוונים הנתמכים עבור כל אחת מהן.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "החזרת רשימת כל העיצובים הזמינים (זה יכול להיות מותאם מקומית באמצעות <var>$1inlanguagecode</var>, אחרת זה יהיה בשפת התוכן).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "החזרת רשימת תגי הרחבת מפענח.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "החזרת hook־ים של הרחבות מפענח.",
        "apihelp-query+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-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-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-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> או <var>$luserid</var>.",
-       "apihelp-unblock-param-user": "שם משתמש, כתובת IP או טווח כתובות IP לחסימה. לא יכול לשמש יחד עם <var>$1id</var> או <var>$luserid</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-upload-param-sessionkey": "אותו דבר כמו $1filekey, מושאר לצור תאימות אחורה.",
        "apihelp-upload-param-stash": "אם זה מוגדר, השרת יסליק זמנית את הקובץ במקום להוסיף אותו למאגר.",
        "apihelp-upload-param-filesize": "גודל הקובץ של כל ההעלאה.",
-       "apihelp-upload-param-offset": "×\94×\99ס×\98 ×\94×\97ת×\99×\9b×\94 ×\91×\91×\99×\99×\98ים.",
+       "apihelp-upload-param-offset": "×\94×\99ס×\98 ×\94פ×\9c×\97 ×\91×\91תים.",
        "apihelp-upload-param-chunk": "תוכן החתיכה.",
        "apihelp-upload-param-async": "להפוך פעולות קבצים גדולות לאסינכרוניות כשאפשר.",
        "apihelp-upload-param-checkstatus": "לאחזר רק מצב העלאה עבור מפתח הקובץ שניתן.",
        "apihelp-userrights-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> לחודש אחד.",
        "apihelp-validatepassword-description": "לבדוק תקינות ססמה אל מול מדיניות הססמאות של הוויקי.\n\nהתקינות מדווחת כ־<samp>Good</samp> אם הססמה קבילה, <samp>Change</samp> אם הססמה יכולה לשמש לכניסה, אבל צריכה להשתנות, או <samp>Invalid</samp> אם הססמה אינה שמישה.",
        "apihelp-validatepassword-param-password": "ססמה שתקינותה תיבדק.",
        "apihelp-validatepassword-param-user": "שם משתמש, לשימוש בעת בדיקת יצירת חשבון. המשתמש ששמו ניתן צריך לא להיות קיים.",
        "apierror-blockedfrommail": "נחסמת משליחת דוא״ל.",
        "apierror-blocked": "נחסמת מעריכה.",
        "apierror-botsnotsupported": "הממשק הזה לא נתמך עבור בוטים.",
+       "apierror-cannot-async-upload-file": "הפרמטרים  <var>async</var> ו־<var>file</var> אינם יכולים להיות משולבים. אם ברצונך לבצע עיבוד אסינכרוני של הקובץ המועלה שלך, יש להעלות אותו תחילה לסליק (באמצעות הפרמטר <var>stash</var>) ואז לפרסם את הקובץ המוסלק באופן אסינכרוני (באמצעות <var>filekey</var> ו־<var>async</var>).",
        "apierror-cannotreauthenticate": "הפעולה הזאת אינה זמינה, כי הזהות שלך לא יכולה להיות מאומתת.",
        "apierror-cannotviewtitle": "אין לך הרשאה להציג את $1.",
        "apierror-cantblock-email": "אין לך הרשאה לחסום משתמשים משליחת דואר אלקטרוני דרך הוויקי.",
        "apierror-integeroutofrange-abovemax": "<var>$1</var> אינו יכול להיות גדול מ־$2 (עכשיו מוגדר $3) עבור משתמשים.",
        "apierror-integeroutofrange-belowminimum": "<var>$1</var> אינו יכול להיות גדול מ־$2 (עכשיו מוגדר $3).",
        "apierror-invalidcategory": "שם הקטגוריה שהזנת אינו תקין.",
+       "apierror-invalid-chunk": "ההיסט בתוספת הפלח הנוכחי גדולים מגודל הקובץ כפי שנטען.",
+       "apierror-invalidexpiry": "זמן תפוגה בלתי־תקין \"$1\".",
        "apierror-invalid-file-key": "לא מפתח קובץ תקין.",
+       "apierror-invalidlang": "קוד שפה בלתי־תקין לפרמטר <var>$1</var>.",
+       "apierror-invalidoldimage": "הפרמטר <var>oldimage</var> נשלח בתסדיר בלתי־תקין.",
+       "apierror-invalidparammix-cannotusewith": "הפרמטר <kbd>$1</kbd> אינו יכול לשמש עם <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "הפרמטר <kbd>$1</kbd> יכול לשמש רק עם <kbd>$2</kbd>.",
+       "apierror-invalidparammix-parse-new-section": "לא ניתן לשלב את <kbd>section=new</kbd> עם הפרמטרים <var>oldid</var>‏, <var>pageid</var> או <var>page</var>. נא להשתמש ב־<var>title</var> ו־<var>text</var>.",
+       "apierror-invalidparammix": "{{PLURAL:$2|הפרמטרים}} $1 אינם יכולים לשמש יחדיו.",
+       "apierror-invalidsection": "הפרמטר <var>section</var> להיות מזהה מקטע תקין או <kbd>new</kbd>.",
+       "apierror-invalidsha1base36hash": "גיבוב ה־SHA1Base36 שסופק אינו תקין.",
+       "apierror-invalidsha1hash": "גיבוב ה־SHA1 שסופק אינו תקין.",
        "apierror-invalidtitle": "כותרת רעה \"$1\".",
+       "apierror-invalidurlparam": "ערך בלתי־תקין עבור <var>$1urlparam</var> (ערך: <kbd>$2=$3</kbd>).",
        "apierror-invaliduser": "שם משתמש בלתי־תקין \"$1\".",
+       "apierror-invaliduserid": "מזהה המשתמש <var>$1</var> אינו תקין.",
+       "apierror-maxlag-generic": "ממתין לשרת מסד נתונים: עיכוב של {{PLURAL:$1|שנייה אחת|$1 שניות}}.",
        "apierror-maxlag": "ממתין ל־$2: שיהוי של {{PLURAL:$1|שנייה אחת|$1 שניות}}.",
+       "apierror-mimesearchdisabled": "חיפוש MIME כבוי במצב קמצן.",
+       "apierror-missingcontent-pageid": "תוכן חסר עבור מזהה הדף $1.",
+       "apierror-missingparam-at-least-one-of": "דרוש {{PLURAL:$2|הפרמטר|לפחות אחד מהפרמטרים}} $1.",
+       "apierror-missingparam-one-of": "דרוש {{PLURAL:$2|הפרמטר|אחד מהפרמטרים}} $1.",
+       "apierror-missingparam": "הפרמטר <var>$1</var> צריך להיות מוגדר.",
+       "apierror-missingrev-pageid": "אין גרסה נוכחית של דף עם המזהה $1.",
+       "apierror-missingtitle-createonly": "כותרות חסרות יכולות להיות מוגנות עם <kbd>create</kbd>.",
+       "apierror-missingtitle": "הדף שנתת אינו קיים.",
+       "apierror-missingtitle-byname": "הדף $1 אינו קיים.",
+       "apierror-moduledisabled": "המודול <kbd>$1</kbd> כובה.",
+       "apierror-multival-only-one-of": "{{PLURAL:$3|רק הערך|רק אחד מתוך הערכים}} $2 מותר עבור הפרמטר <var>$1</var>.",
+       "apierror-multival-only-one": "רק ערך אחד מותר עבור הפרמטר <var>$1</var>.",
+       "apierror-multpages": "<var>$1</var> יכול לשמש רק בדף בודד.",
+       "apierror-mustbeloggedin-changeauth": "יש להיכנס לחשבון כדי לשנות נתוני אימות.",
        "apierror-mustbeloggedin-generic": "חובה להיכנס.",
        "apierror-mustbeloggedin-linkaccounts": "חובה להיכנס לחשבון כדי לקשר חשבונות.",
        "apierror-mustbeloggedin-removeauth": "חובה להיכנס לחשבון כדי להסיר מידע אימות.",
        "apierror-mustbeloggedin-uploadstash": "סליק ההעלאה זמין רק למשתמשים שנכנסו לחשבון.",
        "apierror-mustbeloggedin": "חובה להיכנס לחשבון כדי $1.",
+       "apierror-mustbeposted": "המודול <kbd>$1</kbd> דורש בקשת POST.",
+       "apierror-mustpostparams": "{{PLURAL:$2|הפרמטר הבא|הפרמטרים הבאים}} נמצאו במחרוזת השאילתה, אבל חייבים להיות ב־POST בגוף: $1.",
+       "apierror-noapiwrite": "עריכת הוויקי הזה דרך ה־API כובתה. נא לוודא שהמשפט <code dir=\"ltr\">$wgEnableWriteAPI=true;</code> כלול בקובץ <code>LocalSettings.php</code> של הוויקי.",
        "apierror-nochanges": "לא התבקשו שינויים.",
        "apierror-nodeleteablefile": "אין גרסה ישנה כזאת של הקובץ.",
        "apierror-no-direct-editing": "עריכה ישירה דרך ה־API אינה נתמכת עבור דגם התוכן $1 שמשמש ב{{GRAMMAR:תחילית|$2}}.",
        "apierror-noedit-anon": "משתמשים אלמוניים אינם יכולים לערוך דפים.",
+       "apierror-noedit": "אין לך הרשאה לערוך דפים.",
+       "apierror-noimageredirect-anon": "משתמשים אלמוניים אינם יכולים ליצור הפניות לתמונות.",
+       "apierror-noimageredirect": "אין לך הרשאה ליצור הפניות לתמונות.",
+       "apierror-nosuchlogid": "אין רשומה ביומן עם המזהה $1.",
+       "apierror-nosuchpageid": "אין דף עם המזהה $1.",
+       "apierror-nosuchrcid": "לא נעשה לאחרונה שינוי עם המזהה $1.",
+       "apierror-nosuchrevid": "אין גרסה עם המזהה $1.",
+       "apierror-nosuchsection": "לא קיים מקטע $1.",
+       "apierror-nosuchsection-what": "אין מקטע $1 ב{{GRAMMAR:תחילית|$2}}.",
+       "apierror-nosuchuserid": "אין משתמש עם המזהה $1.",
+       "apierror-notarget": "לא נתת יעד תקין לפעולה הזאת.",
+       "apierror-notpatrollable": "לא ניתן לנטר את הגרסה $1 כי היא ישנה מדי.",
+       "apierror-nouploadmodule": "לא הוגדר מודול העלאה.",
+       "apierror-opensearch-json-warnings": "לא ניתן לייצג את האזהרות בתסדיר JSON של OpenSearch.",
+       "apierror-pagecannotexist": "מרחב השם אינו מתיר דפים אמתיים.",
+       "apierror-pagedeleted": "הדף הזה נמחק מאז שאחזרת את חותם הזמן שלו.",
+       "apierror-pagelang-disabled": "שינוי שפת הדף אסור בוויקי הזה.",
+       "apierror-paramempty": "הפרמטר <var>$1</var> אינו יכול להיות ריק.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> נתמך רק בתוכן קוד ויקי (wikitext).",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> נתמך רק בתוכן קוד ויקי (wikitext). $1 משתמש במודל התוכן $2.",
+       "apierror-pastexpiry": "זמן התפוגה \"$1\" בעבר.",
+       "apierror-permissiondenied": "אין לך הרשאה $1.",
+       "apierror-permissiondenied-generic": "ההרשאה נדחתה.",
+       "apierror-permissiondenied-patrolflag": "עליך להחזיק בהרשאות <code>patrol</code> או <code>patrolmarks</code> כדי לבקש דגל מנוטר.",
+       "apierror-permissiondenied-unblock": "אין לך הרשאה לשחרר חסימה של משתמשים.",
+       "apierror-prefixsearchdisabled": "חיפוש תחילית כבוי במצב קמצן.",
+       "apierror-promised-nonwrite-api": "כותר <code>Promise-Non-Write-API-Action</code> של HTTP אינו יכול להישלח למודולי API שפועלים במצב כתיבה.",
+       "apierror-protect-invalidaction": "סוג הגנה בלתי־תקין \"$1\".",
+       "apierror-protect-invalidlevel": "קמת הגנה בלתי־תקינה \"$1\".",
+       "apierror-ratelimited": "עברת את מכסת הקצב שלך. נא להמתין זמן־מה ונסות שוב.",
+       "apierror-readapidenied": "יש צורך בהרשאת קריאה כדי להשתמש במודול הזה.",
+       "apierror-readonly": "הוויקי הזה במצב לקריאה בלבד עכשיו.",
+       "apierror-reauthenticate": "לא עברת אימות לאחרונה בשיחה הזאת, נא להתאמת מחדש.",
+       "apierror-redirect-appendonly": "ניסית לערוך במצב מעבר־אחר־הפניות (redirect-following), שצריך לשמש יחד עם <kbd>section=new</kbd>‏, <var>prependtext</var>, או <var>appendtext</var>.",
+       "apierror-revdel-mutuallyexclusive": "אותו השדה אינו יכול לשמש עם <var>hide</var> ועם <var>show</var>.",
+       "apierror-revdel-needtarget": "כותרת יעד נחוצה בשביל סוג ה־RevDel הזה.",
+       "apierror-revdel-paramneeded": "לפחות ערך אחד נחוץ בשביל <var>hide</var> או <var>show</var>.",
+       "apierror-revisions-norevids": "הפרמטר <var>revids</var> אינו יכול לשמש עם אפשרויות הרשימה (<var>$1limit</var>‏, <var>$1startid</var>‏, <var>$1endid</var>‏, <kbd>$1dir=newer</kbd>‏, <var>$1user</var>‏, <var>$1excludeuser</var>‏, <var>$1start</var>, ו־<var>$1end</var>).",
+       "apierror-revisions-singlepage": "<var>titles</var>‏, <var>pageids</var> או מחולל שימשו לאספקת דפים מרובים, אבל הפרמטרים <var>$1limit</var>‏, <var>$1startid</var>‏, <var>$1endid</var>‏, <kbd>$1dir=newer</kbd>‏, <var>$1user</var>‏, <var>$1excludeuser</var>‏, <var>$1start</var>, ו־<var>$1end</var> יכולים לשמש רק בדף בודד.",
+       "apierror-revwrongpage": "הגרסה $1 אינה גרסה של $2.",
+       "apierror-searchdisabled": "חיפוש <var>$1</var> כבוי.",
+       "apierror-sectionreplacefailed": "לא היה אפשר למזג את המקטע המעודכן.",
+       "apierror-sectionsnotsupported": "מקטעים אינם נתמכים במודל התוכן $1.",
+       "apierror-sectionsnotsupported-what": "מקטעים אינם נתמכים ב־$1.",
+       "apierror-show": "פרמטר לא נכון – אי־אפשר לספק ערכים שמבטלים זה את זה.",
+       "apierror-siteinfo-includealldenied": "לא ניתן להציג את המידע של כל השרתים אלא אם <var dir=\"ltr\">$wgShowHostNames</var> מוגדר להיות true.",
+       "apierror-sizediffdisabled": "ההבדל בגודל כבוי במצב קמצן.",
+       "apierror-spamdetected": "העריכה שלך סורבה כי הכילה חלק ספאם: <code>$1</code>.",
+       "apierror-specialpage-cantexecute": "אין לך הרשאה להציג את התוצאות של הדף המיוחד הזה.",
+       "apierror-stashedfilenotfound": "לא היה אפשר למצור את הקובץ בסליק: $1.",
+       "apierror-stashedit-missingtext": "לא נמצא טקסט מוסלק עם הגיבוב שניתן.",
+       "apierror-stashfailed-complete": "העלאה מפולחת הושלמה, יש לבדוק את המצב בשביל לראות פרטים.",
+       "apierror-stashfailed-nosession": "אין שיחת העלאה מפולחת עם המפתח הזה.",
+       "apierror-stashfilestorage": "לא היה אפשר לאחסן את ההעלאה בסליק: $1",
+       "apierror-stashinvalidfile": "קובץ מוסלק בלתי־תקין.",
        "apierror-stashnosuchfilekey": "אין מפתח קובץ כזה: $1.",
+       "apierror-stashpathinvalid": "מפתח קובץ מתסדיר בלתי־הולם או בלתי־תקין באופן אחר: $1.",
+       "apierror-stashwrongowner": "בעלים בלתי־תקין: $1",
+       "apierror-stashzerolength": "קובץ באורך אפס, ואל יכול משוחזר בסליק: $1.",
+       "apierror-systemblocked": "נחסמת אוטומטית על־ידי מדיה־ויקי.",
+       "apierror-templateexpansion-notwikitext": "הרחבת תבניות נתמכת רק בתוכן קוד ויקי (wikitext). $1 משתמש במודל התוכן $2.",
+       "apierror-toofewexpiries": "{{PLURAL:$1|ניתן חותם זמן תפוגה אחד|ניתנו $1 חותמי זמן תפוגה}} כאשר {{PLURAL:$2|היה נחוץ אחד|היו נחוצים $1}}.",
+       "apierror-unknownaction": "הפעולה שניתנה, <kbd>$1</kbd>, אינה מוכרת.",
+       "apierror-unknownerror-editpage": "שגיאת EditPage בלתי־ידועה: $1.",
        "apierror-unknownerror-nocode": "שגיאה בלתי־ידועה.",
        "apierror-unknownerror": "שגיאה בלתי ידועה: \"$1\".",
        "apierror-unknownformat": "תסדיר בלתי־ידוע \"$1\".",
+       "apierror-unrecognizedparams": "{{PLURAL:$2|פרמטר בלתי־מוכר|פרמטרים בלתי־מוכרים}}: $1.",
+       "apierror-unrecognizedvalue": "לפרמטר <var>$1</var> יש ערך בלתי־מוכר: $2.",
+       "apierror-unsupportedrepo": "מאגר קבצים מקומי אינו תומך בשאילתה לכל התמונות.",
        "apierror-upload-filekeyneeded": "חובה לספק <var>filekey</var> כאשר <var>offset</var> אינו אפס.",
        "apierror-upload-filekeynotallowed": "לא ניתן לספק <var>filekey</var> כאשר <var>offset</var> הוא 0.",
+       "apierror-upload-inprogress": "העלאה מתוך סליק כבר התחילה.",
        "apierror-upload-missingresult": "אין תוצאות בנתוני מצב.",
+       "apierror-urlparamnormal": "לא היה אפשר לנרמל את פרמטרי התמונה עבור $1.",
+       "apierror-writeapidenied": "אין לך הרשאה לערוך את הוויקי הזה דרך ה־API.",
+       "apiwarn-alldeletedrevisions-performance": "לביצועים טובים יותר בעת יצירת כותרת, יש להשתמש ב־<kbd>$1dir=newer</kbd>.",
+       "apiwarn-badurlparam": "לא היה אפשר לפענח את <var>$1urlparam</var> עבור $2. משתמשים רק ב־width ו־height.",
+       "apiwarn-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-nobotpw": "כניסה בחשבון ראשי עם <kbd>action=login</kbd> מיושנת ויכולה להפסיק לעבוד ללא אזהרה. כדי להיכנס באופן מאובטח, ר' <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-token": "אחזור אסימון דרך <kbd>action=login</kbd> מיושן. נא להשתמש ב־<kbd>action=query&meta=tokens&type=login</kbd> במקום זה.",
+       "apiwarn-deprecation-parameter": "הפרמטר <var>$1</var> מיושן.",
+       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> מיושן מאז מדיה־ויקי 1.28. יש להשתמש ב־<kbd>prop=headhtml</kbd> בעת יצירת מסמכי HTML חדשים, או ב־<kbd>prop=modules|jsconfigvars</kbd> בעת עדכון מסמך בצד הלקוח.",
+       "apiwarn-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-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 e6320cc..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-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.",
index 9f5b6d6..d84775f 100644 (file)
        "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-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>$luserid</var>.",
-       "apihelp-unblock-param-userid": "ID utente da sbloccare. Non può essere usato insieme a <var>$1id</var> o <var>$luserid</var>.",
+       "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.",
        "api-help-authmanagerhelper-returnurl": "URL di ritorno per i flussi di autenticazione di terze parti, deve essere assoluto. E' necessario fornirlo, oppure va fornito <var>$1continue</var>.\n\nAlla ricezione di una risposta <samp>REDIRECT</samp>, in genere si apre un browser o una vista web all'URL specificato <samp>redirecttarget</samp> per un flusso di autenticazione di terze parti. Quando questo è completato, la terza parte invierà il browser o la vista web a questo URL. Dovresti estrarre qualsiasi parametro POST o della richiesta dall'URL e passarli come un request <var>$1continue</var> a questo modulo API.",
        "api-help-authmanagerhelper-continue": "Questa richiesta è una continuazione dopo una precedente risposta <samp>UI</samp> o <samp>REDIRECT</samp>. È necessario fornirlo, oppure fornire <var>$1returnurl</var>.",
        "api-help-authmanagerhelper-additional-params": "Questo modulo accetta parametri aggiuntivi a seconda delle richieste di autenticazione disponibili. Utilizza <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> (o una precedente risposta da questo modulo, se applicabile) per determinare le richieste disponibili e i campi usati da queste.",
+       "apierror-invalidoldimage": "Il parametro <var>oldimage</var> ha un formato non valido.",
+       "apierror-invaliduserid": "L'ID utente <var>$1</var> non è valido.",
        "apierror-nosuchuserid": "Non c'è alcun utente con ID $1.",
        "api-credits-header": "Crediti"
 }
index e0bb648..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": "削除記録の項目に適用する変更タグ。",
        "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 a3d8d44..30dec54 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 변수]] 에서 더 많은 정보를 얻을 수 있습니다.",
@@ -29,6 +30,7 @@
        "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> 변수와 동일한 값을 사용합니다.",
@@ -46,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": "현재 사용자의 인증 데이터를 변경합니다.",
@@ -59,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.",
@@ -80,6 +84,8 @@
        "apihelp-createaccount-param-language": "사용자에게 기본으로 설정할 언어 코드. (선택 사항, 기본값으로는 본문의 언어입니다)",
        "apihelp-createaccount-example-pass": "사용자 <kbd>testuser</kbd>를 만들고 비밀번호를 <kbd>test123</kbd>으로 설정합니다.",
        "apihelp-createaccount-example-mail": "사용자 <kbd>testmailuser</kbd>를 만들고 자동 생성된 비밀번호를 이메일로 보냅니다.",
+       "apihelp-cspreport-description": "브라우저가 콘텐츠 보안 정책의 위반을 보고하기 위해 사용합니다. 이 모듈은 SCP를 준수하는 웹 브라우저에 의해 자동으로 사용될 때를 제외하고는 사용해서는 안 됩니다.",
+       "apihelp-cspreport-param-reportonly": "강제적 정책이 아닌, 모니터링 정책에서 나온 보고서인 것으로 표시합니다",
        "apihelp-delete-description": "문서 삭제",
        "apihelp-delete-param-title": "삭제할 문서의 제목. <var>$1pageid</var>과 함께 사용할 수 없습니다.",
        "apihelp-delete-param-pageid": "삭제할 문서의 ID. <var>$1title</var>과 함께 사용할 수 없습니다.",
        "apihelp-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-feedwatchlist-param-feedformat": "피드 포맷.",
        "apihelp-feedwatchlist-example-default": "주시문서 목록 피드를 보여줍니다.",
        "apihelp-filerevert-description": "파일을 이전 판으로 되돌립니다.",
+       "apihelp-filerevert-param-filename": "파일: 접두어가 없는 대상 파일 이름.",
        "apihelp-filerevert-param-comment": "업로드 댓글입니다.",
        "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd>를 <kbd>2011-03-05T15:27:40Z</kbd> 판으로 되돌립니다.",
-       "apihelp-help-description": "지정된 모듈의 도움말을 보여줍니다.",
+       "apihelp-help-description": "지정된 모듈의 도움말을 표시합니다.",
+       "apihelp-help-param-modules": "(<var>action</var>, <var>format</var> 변수의 값 또는 <kbd>main</kbd>)에 대한 도움말을 표시하는 모듈입니다. <kbd>+</kbd>로 하위 모듈을 지정할 수 있습니다.",
+       "apihelp-help-param-submodules": "명명된 모듈의 하위 모듈의 도움말을 포함합니다.",
+       "apihelp-help-param-recursivesubmodules": "하위 모듈의 도움말을 반복하여 포함합니다.",
        "apihelp-help-param-helpformat": "도움말 출력 포맷.",
+       "apihelp-help-param-wrap": "표준 API 응답 구조로 출력을 감쌉니다.",
+       "apihelp-help-param-toc": "HTML 출력에 목차를 포함합니다.",
        "apihelp-help-example-main": "메인 모듈의 도움말입니다.",
        "apihelp-help-example-recursive": "모든 도움말을 한 페이지로 모읍니다.",
+       "apihelp-help-example-help": "도움말 모듈 자체에 대한 도움말입니다.",
+       "apihelp-help-example-query": "2개의 쿼리 하위 모듈의 도움말입니다.",
        "apihelp-imagerotate-description": "하나 이상의 그림을 회전합니다.",
        "apihelp-imagerotate-param-rotation": "시계 방향으로 회전할 그림의 각도.",
        "apihelp-import-param-xml": "업로드한 XML 파일.",
-       "apihelp-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-param-rcid": "점검할 최근 바뀜 ID입니다.",
+       "apihelp-patrol-param-revid": "점검할 판 ID입니다.",
+       "apihelp-patrol-example-rcid": "최근의 변경사항을 점검합니다.",
+       "apihelp-patrol-example-revid": "판을 점검합니다.",
        "apihelp-protect-description": "문서의 보호 수준을 변경합니다.",
        "apihelp-protect-param-reason": "보호 또는 보호 해제의 이유.",
        "apihelp-protect-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+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+allusers-description": "등록된 모든 사용자를 열거합니다.",
        "apihelp-query+allusers-param-dir": "정렬 방향.",
        "apihelp-query+allusers-param-prop": "포함할 정보:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "현재 차단된 사용자의 정보를 추가함.",
        "apihelp-query+allusers-paramvalue-prop-editcount": "사용자의 편집 수를 추가합니다.",
        "apihelp-query+allusers-param-witheditsonly": "편집을 한 사용자만 나열합니다.",
        "apihelp-query+allusers-example-Y": "<kbd>Y</kbd>로 시작하는 사용자를 나열합니다.",
        "apihelp-query+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+watchlist-paramvalue-prop-flags": "편집에 대한 플래그를 추가합니다.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "적절한 곳에 로그 정보를 추가합니다.",
        "apihelp-removeauthenticationdata-description": "현재 사용자의 인증 데이터를 제거합니다.",
+       "apihelp-resetpassword-description": "비밀번호 재설정 이메일을 사용자에게 보냅니다.",
+       "apihelp-resetpassword-param-user": "재설정할 사용자입니다.",
+       "apihelp-resetpassword-param-email": "재설정할 사용자의 이메일 주소입니다.",
+       "apihelp-resetpassword-example-user": "사용자 <kbd>Example</kbd>에게 비밀번호 재설정 이메일을 보냅니다.",
+       "apihelp-resetpassword-example-email": "<kbd>user@example.com</kbd> 이메일 주소를 가진 모든 사용자에 대해 비밀번호 재설정 이메일을 보냅니다.",
        "apihelp-revisiondelete-description": "판을 삭제하거나 되살립니다.",
        "apihelp-revisiondelete-param-reason": "삭제 또는 복구 이유.",
        "apihelp-rollback-param-tags": "되돌리기를 적용하기 위해 태그합니다.",
+       "apihelp-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>$luserid</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-upload-param-filename": "대상 파일 이름.",
        "apihelp-upload-param-ignorewarnings": "모든 경고를 무시합니다.",
        "apihelp-userrights-param-user": "사용자 이름.",
        "apihelp-userrights-param-userid": "사용자 ID.",
        "apihelp-validatepassword-param-email": "계정 생성을 테스트할 때 사용할 이메일 주소입니다.",
        "apihelp-validatepassword-param-realname": "계정 생성을 테스트할 때 사용할 실명입니다.",
-       "apihelp-rawfm-description": "출력 데이터, 디버깅 요소를 포함, (HTML에 포함된)JSON형식.",
+       "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-integer-min": "{{PLURAL:$1|1=값|2=값들}}은 $2 이상이어야 합니다.",
        "api-help-param-integer-max": "{{PLURAL:$1|1=값|2=값들}}은 $3 이하여야 합니다.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=값|2=값들}}은 $2와 $3 사이여야 합니다.",
+       "api-help-param-multi-separate": "<kbd>|</kbd> 또는 [[Special:ApiHelp/main#main/datatypes|대안]]으로 값을 구분합니다.",
        "api-help-param-multi-max": "값들의 최대 수는 {{PLURAL:$1|$1}}입니다. (봇의 경우 {{PLURAL:$2|$2}})",
        "api-help-param-default": "기본값: $1",
        "api-help-param-default-empty": "기본값: <span class=\"apihelp-empty\">(비어 있음)</span>",
+       "api-help-param-token": "\"$1\" 토큰은 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]에서 가져옵니다",
        "api-help-param-token-webui": "호환성을 위해, 웹 UI에 사용된 토큰도 허용합니다.",
        "api-help-param-continue": "더 많은 결과를 이용할 수 있을 때, 계속하려면 이것을 사용하십시오.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(설명 없음)</span>",
        "api-help-permissions-granted-to": "{{PLURAL:$1|다음 그룹에 부여됨}}: $2",
        "api-help-right-apihighlimits": "API 쿼리에서 더 높은 제한 사용 (느린 쿼리: $1, 빠른 쿼리: $2) 느린 쿼리에 대한 제한은 다중값 매개변수에도 적용됩니다.",
        "api-help-open-in-apisandbox": "<small>[연습장에서 열기]</small>",
+       "api-help-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-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-filenopath": "로컬 파일 경로를 가져올 수 없습니다.",
        "apierror-import-unknownerror": "알 수 없는 가져오기 오류: $1.",
        "apierror-invalidcategory": "입력한 분류 이름이 올바르지 않습니다.",
+       "apierror-invalidexpiry": "잘못된 만료 기한 \"$1\".",
        "apierror-invalid-file-key": "유효한 파일 키가 아닙니다.",
-       "apierror-invalidoldimage": "oldimage 변수에 유효하지 않은 형식이 있습니다.",
+       "apierror-invalidoldimage": "<var>oldimage</var> 변수에 유효하지 않은 형식이 있습니다.",
        "apierror-invalidparammix-cannotusewith": "<kbd>$1</kbd> 변수는 <kbd>$2</kbd>와(과) 함께 사용할 수 없습니다.",
        "apierror-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-nosuchuserid": "ID $1에 해당하는 사용자가 없습니다.",
        "apierror-notarget": "이 작업을 위한 유효한 대상을 지정하지 않았습니다.",
        "apierror-pagecannotexist": "이름공간은 실제 페이지를 허용하지 않습니다.",
+       "apierror-pagelang-disabled": "이 위키에서 문서의 언어 변경은 허용되지 않습니다.",
        "apierror-permissiondenied": "$1에 대한 권한이 없습니다.",
        "apierror-permissiondenied-generic": "권한이 없습니다.",
        "apierror-permissiondenied-unblock": "사용자의 차단을 해제할 권한이 없습니다.",
index 4a98f4a..a803645 100644 (file)
        "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",
        "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-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.",
index 79c3e63..0935c59 100644 (file)
        "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.",
        "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-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.",
index 3abfdeb..3045332 100644 (file)
@@ -13,8 +13,8 @@
        "apihelp-main-param-maxage": "Задајте му олку секунди на заглавието за контрола HTTP-меѓускладот <code>s-maxage</code>. Грешките никогаш не се чуваат во меѓускладот.",
        "apihelp-main-param-assert": "Провери дали корисникот е најавен ако е зададено <kbd>user</kbd> или дали го има корисничкото право на бот, ако е зададено <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "Тука внесената вредност ќе биде вклучена во извештајот. Може да се користи за разликување на барањата.",
-       "apihelp-main-param-servedby": "Вклучи го домаќинското име што го услужило барањето во резултатите.",
-       "apihelp-main-param-curtimestamp": "Ð\91клÑ\83Ñ\87и Ñ\82ековно Ð²Ñ\80еме Ð¸ Ð²Ñ\80еме Ð¸ Ð´Ð°Ñ\82Ñ\83м Ð²Ð¾ Ñ\80езÑ\83лÑ\82аÑ\82от.",
+       "apihelp-main-param-servedby": "Вклучи го домаќинското име што го услужило барањето во исходот.",
+       "apihelp-main-param-curtimestamp": "Ð\92клÑ\83Ñ\87и Ñ\82ековно Ð²Ñ\80еме Ð¸ Ð²Ñ\80еме Ð¸ Ð´Ð°Ñ\82Ñ\83м Ð²Ð¾ Ð¸Ñ\81Ñ\85одот.",
        "apihelp-main-param-origin": "Кога му пристапувате на Пирлогот користејќи повеќедоменско AJAX-барање (CORS), задајте му го на ова изворниот домен. Ова мора да се вклучи во секое подготвително барање и затоа мора да биде дел од URI на барањето (не главната содржина во POST). Ова мора точно да се совпаѓа со еден од изворниците на заглавието Origin:, така што мора да е зададен на нешто како <kbd>https://mk.wikipedia.org</kbd>  or <kbd>https://meta.wikimedia.org</kbd>. Ако овој параметар не се совпаѓа со заглавието <code>Origin</code>:, ќе се појави одговор 403. Ако се совпаѓа, а изворникот е на бел список (на допуштени), тогаш ќе се зададе заглавието <code>Access-Control-Allow-Origin</code>.",
        "apihelp-main-param-uselang": "Јазик за преведување на пораките. Список на јазични кодови ќе најдете на <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> со <kbd>siprop=languages</kbd> или укажете <kbd>user</kbd> за да го користите тековно зададениот јазик корисникот, или пак укажете <kbd>content</kbd> за да го користите јазикот на содржината на ова вики.",
        "apihelp-block-description": "Блокирај корисник.",
@@ -79,7 +79,7 @@
        "apihelp-edit-param-tags": "Ознаки за измена што се однесуваат на преработката.",
        "apihelp-edit-param-minor": "Ситно уредување.",
        "apihelp-edit-param-notminor": "Неситно уредување.",
-       "apihelp-edit-param-bot": "Означи го уредувањево како ботско.",
+       "apihelp-edit-param-bot": "Означи го уредувањево како ботовско.",
        "apihelp-edit-param-basetimestamp": "Датум и време на преработката на базата, кои се користат за утврдување на спротиставености во уредувањето. Може да се добие преку [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
        "apihelp-edit-param-starttimestamp": "Датум и време кога сте почнало уредувањето, кои се користат за утврдување на спротиставености во уредувањата. Соодветната вредност се добива користејќи <var>[[Special:ApiHelp/main|curtimestamp]]</var> кога ќе почнете со уредување (на пр. кога ќе се вчита содржината што ќе ја уредувате).",
        "apihelp-edit-param-recreate": "Занемари ги грешките што се појавуваат во врска со страницата што е избришана во меѓувреме.",
        "apihelp-expandtemplates-param-title": "Наслов на страница.",
        "apihelp-expandtemplates-param-text": "Викитекст за претворање.",
        "apihelp-expandtemplates-param-revid": "Назнака на преработката, за <nowiki>{{REVISIONID}}</nowiki> и слични променливи.",
-       "apihelp-expandtemplates-param-prop": "Кои информации треба да ги добиете:\n\nИмајте на ум дека ако не изберете никаква вредност, резултатот ќе го содржи викитекстот, но изводот ќе биде во застарен формат.",
+       "apihelp-expandtemplates-param-prop": "Кои информации треба да ги добиете:\n\nИмајте на ум дека ако не изберете никаква вредност, исходот ќе го содржи викитекстот, но изводот ќе биде во застарен формат.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Проширениот викитекст.",
        "apihelp-expandtemplates-param-includecomments": "Дали во изводот да се вклучени HTML-коментари.",
        "apihelp-expandtemplates-param-generatexml": "Создај XML-дрво на расчленување (заменето со $1prop=parsetree).",
        "apihelp-feedcontributions-param-deletedonly": "Прикажувај само избришани придонеси.",
        "apihelp-feedcontributions-param-toponly": "Прикажувај само последни преработки.",
        "apihelp-feedcontributions-param-newonly": "Прикажувај само новосоздадени страници",
+       "apihelp-feedcontributions-param-hideminor": "Сокриј ситни уредувања.",
        "apihelp-feedcontributions-param-showsizediff": "Покажувај ја големинската разлика меѓу преработките.",
        "apihelp-feedcontributions-example-simple": "Покажувај придонеси на <kbd>Пример</kbd>.",
        "apihelp-feedrecentchanges-description": "Дава канал со скорешни промени.",
        "apihelp-feedrecentchanges-param-feedformat": "Форматот на каналот.",
-       "apihelp-feedrecentchanges-param-namespace": "Ð\9dа ÐºÐ¾Ñ\98 Ð¸Ð¼ÐµÐ½Ñ\81ки Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87аÑ\82 Ñ\80езÑ\83лÑ\82аÑ\82иÑ\82е.",
+       "apihelp-feedrecentchanges-param-namespace": "Ð\9dа ÐºÐ¾Ñ\98 Ð¸Ð¼ÐµÐ½Ñ\81ки Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87и Ð¸Ñ\81Ñ\85одоÑ\82.",
        "apihelp-feedrecentchanges-param-invert": "Сите именски простори освен избраниот.",
        "apihelp-feedrecentchanges-param-associated": "Вклучи придружни именски простори (разговор или главен).",
-       "apihelp-feedrecentchanges-param-days": "Ð\9dа ÐºÐ¾Ð¸ Ð´ÐµÐ½Ð¾Ð²Ð¸ Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87аÑ\82 Ñ\80езÑ\83лÑ\82аÑ\82ите.",
+       "apihelp-feedrecentchanges-param-days": "Ð\9dа ÐºÐ¾Ð¸ Ð´ÐµÐ½Ð¾Ð²Ð¸ Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87аÑ\82 Ñ\81Ñ\82авките.",
        "apihelp-feedrecentchanges-param-limit": "Највеќе ставки во исходот за прикажување.",
        "apihelp-feedrecentchanges-param-from": "Прикажи ги промените оттогаш.",
        "apihelp-feedrecentchanges-param-hideminor": "Скриј ги ситните промени.",
        "apihelp-feedrecentchanges-param-hideliu": "Скриј ги промените направени од регистрирани корисници.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Скриј ги испатролираните промени.",
        "apihelp-feedrecentchanges-param-hidemyself": "Скриј ги промените на тековниот корисник.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Сокриј префрлања во други категории.",
        "apihelp-feedrecentchanges-param-tagfilter": "Филтрирање по ознака.",
        "apihelp-feedrecentchanges-param-target": "Прикажи само промени на страници што водат од оваа.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Наместо тоа, прикажи ги промените на страниците поврзани со избраната страница.",
+       "apihelp-feedrecentchanges-param-categories": "Прикажи само промени на страниците во сите овие категории.",
+       "apihelp-feedrecentchanges-param-categories_any": "Прикажи само промени на страниците во било која од категориите.",
        "apihelp-feedrecentchanges-example-simple": "Прикажи скорешни промени",
        "apihelp-feedrecentchanges-example-30days": "Прикажувај скорешни промени 30 дена",
        "apihelp-feedwatchlist-description": "Дава канал од набљудуваните.",
        "apihelp-help-param-wrap": "Обвиткај го изводот како станрадна одѕивна структура од прилотот.",
        "apihelp-help-param-toc": "Вклучи табела со содржина во HTML-изводот.",
        "apihelp-help-example-main": "Помош за главниот модул",
+       "apihelp-help-example-submodules": "Помош за <kbd>action=query</kbd> и сите негови подмодули.",
        "apihelp-help-example-recursive": "Сета помош на една страница",
        "apihelp-help-example-help": "Помош за самиот помошен модул",
        "apihelp-help-example-query": "Помош за два подмодула за барања",
        "apihelp-imagerotate-description": "Сврти една или повеќе слики.",
        "apihelp-imagerotate-param-rotation": "За колку степени да се сврти надесно.",
+       "apihelp-imagerotate-param-tags": "Ознаки за примена врз ставката во дневникот на подигања.",
        "apihelp-imagerotate-example-simple": "Сврти ја <kbd>Податотека:Пример.png</kbd> за <kbd>90</kbd> степени.",
        "apihelp-imagerotate-example-generator": "Сврти ги сите слики во <kbd>Категорија:Некоја</kbd> за <kbd>180</kbd> степени.",
        "apihelp-import-description": "Увези страница од друго вики или од XML-податотека.\n\nИмајте на ум дека POST на HTTP мора да се изведе како подигање на податотеката (т.е. користејќи повеќеделни податоци/податоци од образец) кога ја испраќате податотеката за параметарот <var>xml</var>.",
-       "apihelp-import-param-summary": "Увези Ð¾пис.",
+       "apihelp-import-param-summary": "Ð\9eпиÑ\81 Ð½Ð° Ñ\83возоÑ\82 Ð½Ð° Ð´Ð½ÐµÐ²Ð½Ð¸Ñ\87ки Ð·Ð°пис.",
        "apihelp-import-param-xml": "Подигната XML-податотека.",
        "apihelp-import-param-interwikisource": "За меѓујазични увози: од кое вики да се увезе.",
        "apihelp-import-param-interwikipage": "За меѓујазични увози: страница за увоз.",
        "apihelp-move-example-move": "Премести го <kbd>Badtitle</kbd> на <kbd>Goodtitle</kbd>, неоставајќи пренасочување",
        "apihelp-opensearch-description": "Пребарување на викито со протоколот OpenSearch.",
        "apihelp-opensearch-param-search": "Низа за пребарување.",
-       "apihelp-opensearch-param-limit": "Ð\9dаÑ\98веÑ\9cе Ñ\80езÑ\83лÑ\82аÑ\82и за прикажување.",
+       "apihelp-opensearch-param-limit": "Ð\9dаÑ\98веÑ\9cе Ñ\81Ñ\82авки за прикажување.",
        "apihelp-opensearch-param-namespace": "Именски простори за пребарување.",
        "apihelp-opensearch-param-suggest": "Не прави ништо ако <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> е неточно.",
-       "apihelp-opensearch-param-redirects": "Ð\9aако Ð´Ð° Ñ\81е Ñ\80абоÑ\82и Ñ\81о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aа:\n;return: Ð\94аÑ\98 Ð³Ð¾ Ñ\81амоÑ\82о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе.\n;resolve: Ð\94аÑ\98 Ñ\98а Ñ\86елнаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а. Ð\9cоже Ð´Ð° Ð´Ð°Ð´Ðµ Ð¿Ð¾Ð¼Ð°Ð»ÐºÑ\83 Ð¾Ð´ $1limit Ñ\80езÑ\83лÑ\82аÑ\82и.\nОд историски причини, по основно е „return“ за $1format=json и „resolve“ за други формати.",
+       "apihelp-opensearch-param-redirects": "Ð\9aако Ð´Ð° Ñ\81е Ñ\80абоÑ\82и Ñ\81о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aа:\n;return: Ð\94аÑ\98 Ð³Ð¾ Ñ\81амоÑ\82о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе.\n;resolve: Ð\94аÑ\98 Ñ\98а Ñ\86елнаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а. Ð\9cоже Ð´Ð° Ð´Ð°Ð´Ðµ Ð¿Ð¾Ð¼Ð°Ð»ÐºÑ\83 Ð¾Ð´ $1limit Ñ\81Ñ\82авки.\nОд историски причини, по основно е „return“ за $1format=json и „resolve“ за други формати.",
        "apihelp-opensearch-param-format": "Формат на изводот.",
        "apihelp-opensearch-example-te": "Најди страници што почнуваат со <kbd>Те</kbd>.",
        "apihelp-options-description": "Смени ги нагодувањата на тековниот корисник.\n\nМожат да се зададат само можностите заведени во јадрото или во едно од воспоставените додатоци, или пак можности со клуч кој ја има претставката <code>userjs-</code> (предвиден за употреба од кориснички скрипти).",
        "apihelp-query+revisions-example-first5-user": "Дај ги првите 5 преработки на <kbd>Главна страница</kbd> кои се направени од корисникот „зададен од МедијаВики“ (<kbd>MediaWiki default</kbd>)",
        "apihelp-query+search-example-simple": "Побарај <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Побарај го <kbd>meaning</kbd> по текстовите.",
-       "apihelp-query+search-example-generator": "Дај информации за страниците што излегуваат во резултатите од пребарувањето на <kbd>meaning</kbd>.",
+       "apihelp-query+search-example-generator": "Дај информации за страниците што излегуваат во исходот од пребарувањето на <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "Дај општи информации за мрежното место.",
        "apihelp-upload-param-filename": "Целно име на податотеката.",
        "apihelp-upload-param-comment": "Коментар при подигање. Се користи и како првичен текст на страницата за нови податотеки ако не е укажано <var>$1text</var>.",
        "apihelp-xml-param-xslt": "Ако е укажано, ја додава именуваната страница како XSL-стилска страница. Вредноста мора да биде наслов во именскиот простор „{{ns:MediaWiki}}“ што ќе завршува со <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Ако е укажано, додава именски простор XML.",
        "apihelp-xmlfm-description": "Давај го изводот во XML-формат (подобрен испис во HTML).",
-       "api-format-title": "РезÑ\83лÑ\82аÑ\82 од Извршникот на МедијаВики",
+       "api-format-title": "Ð\98Ñ\81Ñ\85од од Извршникот на МедијаВики",
        "api-format-prettyprint-header": "Ова е HTML-претстава на форматот $1. HTML е добар за отстранување на грешки, но не е погоден за употреба во извршник.\n\nУкажете го параметарот <var>format</var> за да го смените изводниот формат. За да ги видите претставите на форматот $1 вон HTML, задајте <kbd>format=$2</kbd>.\n\nПовеќе информации ќе најдете на [[mw:API|целосната документација]], или пак [[Special:ApiHelp/main|помош со извршникот]].",
        "api-pageset-param-titles": "Список на наслови на кои ќе се работи",
        "api-pageset-param-pageids": "Список на назнаки за страници на кои ќе се работи",
        "api-help-param-token": "Шифра „$1“ добиена од [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-param-token-webui": "За складност, се прифаќа и шифрата што се користи за обичниот кориснички посредник.",
        "api-help-param-disabled-in-miser-mode": "Исклучено поради [[mw:Manual:$wgMiserMode|скржавиот режим]].",
-       "api-help-param-limited-in-miser-mode": "<strong>Напомена:</strong> Бидејќи сте во [[mw:Manual:$wgMiserMode|скржав режим]], користејќи го ова може да добиете помалку од <var>$1limit</var> резултати пред да продолжите; во крајни случаи може да не добиете ниеден резултат.",
+       "api-help-param-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": "Употребете го ова за да продолжите кога има повеќе расположиви ставки.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(нема опис)</span>",
index c1a71a4..a305bc2 100644 (file)
        "apihelp-main-param-smaxage": "Stelt de <code>s-maxage</code> HTTP cache controle header in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.",
        "apihelp-main-param-maxage": "Stelt de <code>max-age</code> HTTP cache controle header in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.",
        "apihelp-main-param-assert": "Controleer of de gebruiker is aangemeld als <kbd>user</kbd> is meegegeven, en of de gebruiker het robotgebruikersrecht heeft als <kbd>bot</kbd> is meegegeven.",
+       "apihelp-main-param-assertuser": "Bevestig dat de huidige gebruiker de genoemde gebruiker is.",
        "apihelp-main-param-requestid": "Elke waarde die hier gegeven wordt, wordt aan het antwoord toegevoegd. Dit kan gebruikt worden om verzoeken te onderscheiden.",
        "apihelp-main-param-servedby": "Voeg de hostnaam van de server die de aanvraag heeft afgehandeld toe aan het antwoord.",
        "apihelp-main-param-curtimestamp": "Huidige tijd aan het antwoord toevoegen.",
+       "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. 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-allowusertalk": "De gebruiker toestaan om hun eigen overlegpagina te bewerken (afhankelijk van <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "De huidige blokkade aanpassen als de gebruiker al geblokkeerd is.",
        "apihelp-block-param-watchuser": "De gebruikerspagina en overlegpagina van de gebruiker of het IP-adres volgen.",
+       "apihelp-block-param-tags": "Wijzigingslabels om toe te passen op de regel in het blokkeerlogboek.",
        "apihelp-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>.",
        "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-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-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>$luserid</var>.",
+       "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.",
index f03af90..8d1f4a5 100644 (file)
        "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 ges seccion $1 dins $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",
index 7369ee1..91e3e50 100644 (file)
        "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+iwbacklinks-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Dodaje prefiks interwiki.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Dodaje tytuł interwiki.",
+       "apihelp-query+iwlinks-description": "Wyświetla wszystkie liki interwiki z danych stron.",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Dodaje pełny adres URL.",
        "apihelp-query+iwlinks-param-limit": "Łączna liczba linków interwiki do zwrócenia.",
        "apihelp-query+langbacklinks-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Dodaje kod języka linku językowego.",
        "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Dodaje tytuł linku językowego.",
        "apihelp-query+langlinks-paramvalue-prop-url": "Dodaje pełny adres URL.",
+       "apihelp-query+links-description": "Zwraca wszystkie linki z danych stron.",
+       "apihelp-query+links-param-namespace": "Pokaż linki tylko w tych przestrzeniach nazw.",
        "apihelp-query+links-param-limit": "Liczba linków do zwrócenia.",
        "apihelp-query+linkshere-description": "Znajdź wszystkie strony, które linkują do danych stron.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Nazwa każdej strony.",
        "apihelp-query+linkshere-param-limit": "Liczba do zwrócenia.",
        "apihelp-query+logevents-description": "Pobierz eventy z logu.",
        "apihelp-query+logevents-example-simple": "Lista ostatnich zarejestrowanych zdarzeń.",
+       "apihelp-query+pagepropnames-param-limit": "Maksymalna liczba zwracanych nazw.",
        "apihelp-query+pageswithprop-param-prop": "Jakie informacje dołączyć:",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Doda ID strony.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "Dodaje wartość właściwości strony.",
+       "apihelp-query+pageswithprop-param-limit": "Maksymalna liczba zwracanych stron.",
+       "apihelp-query+pageswithprop-param-dir": "W jakim kierunku sortować.",
        "apihelp-query+pageswithprop-example-generator": "Pobierz dodatkowe informacje o pierwszych 10 stronach wykorzystując <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+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+tags-paramvalue-prop-active": "Czy znacznik jest nadal stosowany.",
        "apihelp-query+tags-example-simple": "Lista dostęnych tagów.",
        "apihelp-query+templates-description": "Zwraca wszystkie strony osadzone w danych stronach.",
+       "apihelp-query+templates-param-namespace": "Pokaż szablony tylko w tych przestrzeniach nazw.",
        "apihelp-query+templates-param-limit": "Ile szablonów zwrócić?",
        "apihelp-query+transcludedin-paramvalue-prop-title": "Nazwa każdej strony.",
        "apihelp-query+transcludedin-paramvalue-prop-redirect": "Oznacz, jeśli strona jest przekierowaniem.",
        "apihelp-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-stashedit-param-summary": "Opis zmian.",
        "apihelp-tag-param-reason": "Powód zmiany.",
        "apihelp-unblock-description": "Odblokuj użytkownika.",
-       "apihelp-unblock-param-user": "Nazwa użytkownika, adres IP albo zakres adresów IP, które chcesz odblokować. Nie można używać jednocześnie z <var>$1id</var> lub <var>$luserid</var>.",
+       "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ć.",
        "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-invalidoldimage": "Parametr <var>oldimage</var> ma nieprawidłowy format.",
        "apierror-invalidparammix": "{{PLURAL:$2|Parametry}} $1 nie mogą być używane razem.",
        "apierror-invalidtitle": "Zły tytuł „$1”.",
        "apierror-invalidurlparam": "Nieprawidłowa wartość <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "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.",
        "apiwarn-invalidcategory": "„$1” nie jest kategorią.",
        "apiwarn-invalidtitle": "„$1” nie jest poprawnym tytułem.",
        "apiwarn-notfile": "„$1” nie jest plikiem.",
+       "apiwarn-toomanyvalues": "Podano zbyt wiele wartości dla parametru <var>$1</var>. Ograniczenie do $2.",
+       "apiwarn-validationfailed": "Błąd walidacji dla <kbd>$1</kbd>: $2",
        "api-feed-error-title": "Błąd ($1)",
        "api-exception-trace": "$1 w $2($3)\n$4",
        "api-credits-header": "Twórcy",
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 be62f8c..cb5997b 100644 (file)
@@ -28,6 +28,7 @@
        "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. 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)",
@@ -38,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+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+siteinfo-paramvalue-prop-rightsinfo": "Devolve informação sobre os direitos (a licença) da wiki, se disponível.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Devolve informação sobre os tipos de restrição (proteção) disponíveis.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Devolve uma lista das línguas que o MediaWiki suporta (opcionalmente localizada, usando <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Devolve uma lista dos códigos de língua para os quais o [[mw:LanguageConverter|LanguageConverter]] está ativado, e as variantes suportadas para cada código.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Devolve uma lista de todos os temas ativados (opcionalmente localizada, usando <var>$1inlanguagecode</var>, ou então na língua do conteúdo).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Devolve uma lista dos elementos de extensões do analisador sintático.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Devolve uma lista dos ''hooks'' de funções do analisador sintático.",
        "apihelp-query+usercontribs-param-limit": "O número máximo de contribuições a serem devolvidas.",
        "apihelp-query+usercontribs-param-start": "A data e hora da contribuição pela qual será começada a devolução de resultados.",
        "apihelp-query+usercontribs-param-end": "A data e hora da contribuição na qual será terminada a devolução de resultados.",
-       "apihelp-query+usercontribs-param-user": "Os utilizadores cujas contribuições serão obtidas.",
-       "apihelp-query+usercontribs-param-userprefix": "Obter as contribuições de todos os utilizadores cujos nomes começam por este valor. Tem precedência sobre $1user.",
+       "apihelp-query+usercontribs-param-user": "Os utilizadores cujas contribuições serão obtidas. Não pode ser usado em conjunto com <var>$1userids</var> ou <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "Obter as contribuições de todos os utilizadores cujos nomes começam por este valor. Não pode ser usado em conjunto com <var>$1user</var> ou <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "Os identificadores dos utilizadores cujas contribuições serão obtidas. Não pode ser usado em conjunto com <var>$1user</var> ou <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-namespace": "Listar só as contribuições nestes espaços nominais.",
        "apihelp-query+usercontribs-param-prop": "Incluir informações adicionais:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Adiciona os identificadores da página e da revisão.",
        "apihelp-query+users-paramvalue-prop-cancreate": "Indica se pode ser criada uma conta para os nomes de utilizador não registados, mas válidos.",
        "apihelp-query+users-param-attachedwiki": "Com <kbd>$1prop=centralids</kbd>, indicar se o utilizador tem ligação com a wiki designada por este identificador.",
        "apihelp-query+users-param-users": "Uma lista de utilizadores dos quais serão obtidas informações.",
+       "apihelp-query+users-param-userids": "Uma lista de identificadores dos utilizadores de que serão obtidas informações.",
        "apihelp-query+users-param-token": "Em substituição, usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+users-example-simple": "Devolver informações sobre o utilizador <kbd>Example</kbd>.",
        "apihelp-query+watchlist-description": "Obter mudanças recentes das páginas vigiadas do utilizador atual.",
        "apihelp-revisiondelete-param-show": "O que deve ser mostrado para cada revisão.",
        "apihelp-revisiondelete-param-suppress": "Indica se devem ser suprimidos os dados aos administradores como a todos os restantes utilizadores.",
        "apihelp-revisiondelete-param-reason": "O motivo da eliminação ou restauro.",
+       "apihelp-revisiondelete-param-tags": "Etiquetas a aplicar à entrada no registo de eliminações.",
        "apihelp-revisiondelete-example-revision": "Ocultar o conteúdo da revisão <kbd>12345</kbd> na página <kbd>Main Page</kbd>.",
        "apihelp-revisiondelete-example-log": "Ocultar todos os dados na entrada <kbd>67890</kbd> do registo com o motivo <kbd>BLP violation</kbd>.",
        "apihelp-rollback-description": "Desfazer a última edição da página.\n\nSe o último utilizador a editar a página realizou várias edições em sequência, estas serão todas desfeitas.",
        "apihelp-setnotificationtimestamp-example-page": "Reiniciar o estado de notificação da página <kbd>Main page</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Definir a data e hora de notificação para a página <kbd>Main page</kbd> de forma a que todas as edições desde 1 de janeiro de 2012 passem a ser consideradas não vistas",
        "apihelp-setnotificationtimestamp-example-allpages": "Reiniciar o estado de notificação das páginas no espaço nominal <kbd>{{ns:user}}</kbd>.",
+       "apihelp-setpagelanguage-description": "Alterar a língua de uma página.",
+       "apihelp-setpagelanguage-description-disabled": "Não é permitido alterar a língua de uma página nesta wiki.\n\nAtivar <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> para usar esta operação.",
+       "apihelp-setpagelanguage-param-title": "O título da página cuja língua pretende alterar. Não pode ser usado em conjunto com <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-pageid": "O identificador da página cuja língua pretende alterar. Não pode ser usado em conjunto com <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-lang": "O código de língua, da língua para a qual a página será alterada. Usar <kbd>default</kbd> para redefinir a língua da página para a língua padrão de conteúdo da wiki.",
+       "apihelp-setpagelanguage-param-reason": "Motivo da alteração.",
+       "apihelp-setpagelanguage-param-tags": "As etiquetas de modificação a aplicar à entrada no registo que resultar desta operação.",
+       "apihelp-setpagelanguage-example-language": "Alterar a língua da página <kbd>Main Page</kbd> para basco.",
+       "apihelp-setpagelanguage-example-default": "Alterar a língua da página com o identificador 123 para a língua padrão de conteúdo da wiki.",
        "apihelp-stashedit-description": "Preparar uma edição na ''cache'' partilhada.\n\nIsto destina-se a ser usado via AJAX a partir do formulário de edição, para melhorar o desempenho da gravação da página.",
        "apihelp-stashedit-param-title": "Título da página que está a ser editada.",
        "apihelp-stashedit-param-section": "Número da secção. <kbd>0</kbd> para a secção do topo, <kbd>new</kbd> para uma secção nova.",
        "apihelp-tag-param-add": "As etiquetas a serem adicionadas. Só podem ser adicionadas as etiquetas definidas manualmente.",
        "apihelp-tag-param-remove": "As etiquetas a serem removidas. Só podem ser removidas as etiquetas definidas manualmente ou completamente indefinidas.",
        "apihelp-tag-param-reason": "O motivo da alteração.",
+       "apihelp-tag-param-tags": "As etiquetas de modificação a aplicar à entrada no registo que será criada em resultado desta operação.",
        "apihelp-tag-example-rev": "Adicionar a etiqueta <kbd>vandalism</kbd> à revisão com o identificador 123, sem especificar um motivo.",
        "apihelp-tag-example-log": "Remover a etiqueta <kbd>spam</kbd> da entrada do registo com o identificador 123, com o motivo <kbd>Wrongly applied</kbd>.",
        "apihelp-tokens-description": "Obter chaves para operações de modificação de dados.\n\nEste módulo é obsoleto e foi substituído por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-example-edit": "Obter uma chave de edição (padrão).",
        "apihelp-tokens-example-emailmove": "Obter uma chave de correio eletrónico e uma chave de movimentação.",
        "apihelp-unblock-description": "Desbloquear um utilizador.",
-       "apihelp-unblock-param-id": "Identificador do bloqueio a desfazer (obtido com <kbd>list=blocks</kbd>). Não pode ser usado em conjunto com <var>$1user</var> ou <var>$luserid</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>$luserid</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-upload-param-checkstatus": "Obter só o estado de carregamento para a chave de ficheiro indicada.",
        "apihelp-upload-example-url": "Carregar de um URL.",
        "apihelp-upload-example-filekey": "Prosseguir um carregamento que falhou devido a avisos.",
-       "apihelp-userrights-description": "Alterar os membros de um grupo de utilizadores.",
+       "apihelp-userrights-description": "Alterar os grupos a que um utilizador pertence.",
        "apihelp-userrights-param-user": "O nome de utilizador.",
        "apihelp-userrights-param-userid": "O identificador de utilizador.",
-       "apihelp-userrights-param-add": "Adicionar o utilizador a estes grupos.",
+       "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.",
index c6b14cd..cca3a3c 100644 (file)
@@ -46,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-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+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+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+siteinfo-paramvalue-prop-rightsinfo": "{{doc-apihelp-paramvalue|query+siteinfo|prop|rightsinfo}}",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "{{doc-apihelp-paramvalue|query+siteinfo|prop|restrictions}}",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "{{doc-apihelp-paramvalue|query+siteinfo|prop|languages}}",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "{{doc-apihelp-paramvalue|query+siteinfo|prop|languagevariants}}",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "{{doc-apihelp-paramvalue|query+siteinfo|prop|skins}}",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "{{doc-apihelp-paramvalue|query+siteinfo|prop|extensiontags}}",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "{{doc-apihelp-paramvalue|query+siteinfo|prop|functionhooks}}",
        "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-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-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}}",
        "api-help-permissions-granted-to": "Used to introduce the list of groups each permission is assigned to.\n\nParameters:\n* $1 - Number of groups\n* $2 - List of group names, comma-separated",
        "api-help-right-apihighlimits": "{{technical}}{{doc-right|apihighlimits|prefix=api-help}}\nThis message is used instead of {{msg-mw|right-apihighlimits}} in the API help to display the actual limits.\n\nParameters:\n* $1 - Limit for slow queries\n* $2 - Limit for fast queries",
        "api-help-open-in-apisandbox": "Text for the link to open an API example in [[Special:ApiSandbox]].",
-       "api-help-authmanager-general-usage": "Text giving a brief overview of how to use an AuthManager-using API module. Parameters:\n* $1 - Module parameter prefix, e.g. \"login\"\n* $2 - Module name, e.g. \"clientlogin\"\n* $3 - Module path, e.g. \"clientlogin\"\n* $4 - AuthManager action to use with this module.\n* $5 - Token type needed by the module.",
+       "api-help-authmanager-general-usage": "{{doc-important|Do not translate text that either quoted, or inside <nowiki><var></var></nowiki>, <nowiki><kbd></kbd></nowiki>, <nowiki><samp></samp></nowiki>, or <nowiki><code></code></nowiki> in this message.}}\nText giving a brief overview of how to use an AuthManager-using API module. Parameters:\n* $1 - Module parameter prefix, e.g. \"login\"\n* $2 - Module name, e.g. \"clientlogin\"\n* $3 - Module path, e.g. \"clientlogin\"\n* $4 - AuthManager action to use with this module.\n* $5 - Token type needed by the module.",
        "api-help-authmanagerhelper-requests": "{{doc-apihelp-param|description=the \"requests\" parameter for AuthManager-using API modules|params=* $1 - AuthManager action used by this module|paramstart=2|noseealso=1}}",
        "api-help-authmanagerhelper-request": "{{doc-apihelp-param|description=the \"request\" parameter for AuthManager-using API modules|params=* $1 - AuthManager action used by this module|paramstart=2|noseealso=1}}",
        "api-help-authmanagerhelper-messageformat": "{{doc-apihelp-param|description=the \"messageformat\" parameter for AuthManager-using API modules|noseealso=1}}",
        "apierror-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-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}}",
        "apiwarn-deprecation-parse-headitems": "{{doc-apierror}}",
        "apiwarn-deprecation-purge-get": "{{doc-apierror}}",
        "apiwarn-deprecation-withreplacement": "{{doc-apierror}}\n\nParameters:\n* $1 - Query string fragment that is deprecated, e.g. \"action=tokens\".\n* $2 - Query string fragment to use instead, e.g. \"action=tokens\".",
-       "apiwarn-difftohidden": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.",
+       "apiwarn-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-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 c012bef..007c9d7 100644 (file)
@@ -21,7 +21,9 @@
                        "Irus",
                        "MaxBioHazard",
                        "Kareyac",
-                       "Mailman"
+                       "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]].",
@@ -73,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+usercontribs-description": "Получить все правки пользователя",
        "apihelp-revisiondelete-description": "удалить и восстановить редакции",
        "apihelp-stashedit-param-sectiontitle": "Заголовок нового раздела.",
-       "apihelp-unblock-description": "Разблокировать пользователя.",
-       "apihelp-unblock-param-user": "Имя участника, IP-адрес или диапазон IP-адресов, которые вы хотите разблокировать. Нельзя использовать одновременно с <var>$1id</var> или <var>$luserid</var>.",
+       "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-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": "Удалить пользователя из этих групп.",
        "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 b71c88e..1396458 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-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>$luserid</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>$luserid</var>.",
+       "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.",
        "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-invalidsection": "Parametern <var>section</var> måste vara ett giltigt avsnitts-ID eller <kbd>new</kbd>.",
        "apierror-nosuchuserid": "Det finns ingen användare med ID $1.",
        "apierror-protect-invalidaction": "Ogiltig skyddstyp \"$1\".",
        "apierror-systemblocked": "Du har blockerats automatiskt av MediaWiki.",
index aaea10a..996f26e 100644 (file)
@@ -45,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+siteinfo-paramvalue-prop-rightsinfo": "Видає інформацію щодо прав (ліцензії) вікі, якщо наявна.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Видає інформацію про наявні типи обмежень (захисту).",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Видає список мов, які підтримує MediaWiki (за бажанням локалізовані через <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Виводить список кодів мов, для яких увімкнено [[mw:LanguageConverter|LanguageConverter]], а також варіанти, підтримувані кожною з цих мов.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Видає список усіх доступних тем оформлення (опціонально локалізовані з використанням <var>$1inlanguagecode</var>, в іншому разі — мовою вмісту).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Видає список теґів розширення парсеру.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Видає список гуків парсерних функцій.",
        "apihelp-query+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-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> або <var>$luserid</var>.",
-       "apihelp-unblock-param-user": "Ім'я користувача, IP-адреса чи IP-діапазон до розблокування. Не може бути використано разом із <var>$1id</var> або <var>$luserid</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": "Ім'я користувача, для використання при тестуванні створення облікового запису. Вказаний користувач не повинен існувати.",
        "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-invalidexpiry": "Недійсний час завершення «$1».",
        "apierror-invalid-file-key": "Недійсний ключ файлу.",
        "apierror-invalidlang": "Недійсний код мови для параметра <var>$1</var>.",
-       "apierror-invalidoldimage": "Параметр «oldimage» має недійсний формат.",
+       "apierror-invalidoldimage": "Параметр <var>oldimage</var> має недійсний формат.",
        "apierror-invalidparammix-cannotusewith": "Параметр <kbd>$1</kbd> не можна використовувати з <kbd>$2</kbd>.",
        "apierror-invalidparammix-mustusewith": "Параметр <kbd>$1</kbd> можна використовувати тільки з  <kbd>$2</kbd>.",
        "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> не можна поєднувати з параметрами <var>oldid</var>, <var>pageid</var> чи <var>page</var>. Будь ласка, використовуйте <var>title</var> і <var>text</var>.",
        "apierror-invalidparammix": "{{PLURAL:$2|Ці параметри}} $1 не можна використовувати водночас.",
-       "apierror-invalidsection": "Параметр «section» має бути дійсним ідентифікатором розділу або <kbd>new</kbd>.",
+       "apierror-invalidsection": "Параметр <var>section</var> має бути дійсним ідентифікатором розділу або <kbd>new</kbd>.",
        "apierror-invalidsha1base36hash": "Поданий хеш SHA1Base36 недійсний.",
        "apierror-invalidsha1hash": "Поданий хеш SHA1 недійсний.",
        "apierror-invalidtitle": "Погана назва «$1».",
        "apierror-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-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.",
        "apiwarn-redirectsandrevids": "Вирішення перенаправлень не може використовуватись разом з параметром <var>revids</var>. Усі перенаправлення, на які вказує <var>revids</var>, не було вирішено.",
        "apiwarn-tokennotallowed": "Дія «$1» недозволена для поточного користувача.",
        "apiwarn-tokens-origin": "Токени не можна отримати, поки не застосована політика одного походження.",
-       "apiwarn-toomanyvalues": "Надто багато значень задано для параметра <var>$1</var>: ліміт становить $2.",
+       "apiwarn-toomanyvalues": "Надто багато значень задано для параметра <var>$1</var>. Ліміт становить $2.",
        "apiwarn-truncatedresult": "Цей результат було скорочено, оскільки інакше він перевищив би ліміт у $1 байтів.",
-       "apiwarn-unclearnowtimestamp": "Вказування «$2» для параметра мітки часу <var>$1</var> є застарілим. Якщо з якоїсь причини Вам треба чітко вказати поточний час без вираховування його з боку клієнта, використайте <kbd>now<kbd>.",
+       "apiwarn-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-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 87aea16..731a9c0 100644 (file)
@@ -55,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+siteinfo-paramvalue-prop-rightsinfo": "当可用时返回wiki的版权(许可协议)信息。",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "返回可用的编辑限制(保护)类型信息。",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "返回MediaWiki支持的语言列表(可选择使用<var>$1inlanguagecode</var>本地化)。",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "当启用了[[mw:LanguageConverter|语言转换器]],并且每个语言变体都受支持时,返回语言代码列表。",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "返回所有启用的皮肤列表(可选择使用<var>$1inlanguagecode</var>本地化,否则是内容语言)。",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "返回解析器扩展标签列表。",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "返回解析器函数钩列表。",
        "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-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-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>以使用API。",
+       "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-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>或<var>$luserid</var>一起使用。",
-       "apihelp-unblock-param-user": "要解封的用户名、IP地址或IP地址段。不能与<var>$1id</var>或<var>$luserid</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": "用户名,供测试账户创建时使用。命名的用户必须不存在。",
        "api-help-permissions-granted-to": "{{PLURAL:$1|授予}}:$2",
        "api-help-right-apihighlimits": "在API查询中使用更高的上限(慢查询:$1;快查询:$2)。慢查询的限制也适用于多值参数。",
        "api-help-open-in-apisandbox": "<small>[在沙盒中打开]</small>",
-       "api-help-authmanager-general-usage": "使用此模块的一般程序是:\n# 通过<kbd>amirequestsfor=$4</kbd>取得来自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用字段,和来自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用户显示字段,并获得其提交内容。\n# 发送至此模块,提供<var>$1returnurl</var>及任何相关字段。\n# 在响应中检查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>或<samp>FAIL</samp>,您已经完成。操作要么成功,要么不成功。\n#* 如果您收到了<samp>UI</samp>,present the new fields to the user and obtain their submission. Then post to this module with <var>$1continue</var> and the relevant fields set, and repeat step 4.\n#* 如果您收到了<samp>REDIRECT</samp>,direct the user to the <samp>redirecttarget</samp> and wait for the return to <var>$1returnurl</var>. Then post to this module with <var>$1continue</var> and any fields passed to the return URL, and repeat step 4.\n#* 如果您收到了<samp>RESTART</samp>,这意味着身份验证可以工作,但我们没有链接的用户账户。您可以将此看做<samp>UI</samp>或<samp>FAIL</samp>。",
+       "api-help-authmanager-general-usage": "使用此模块的一般程序是:\n# 通过<kbd>amirequestsfor=$4</kbd>取得来自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用字段,和来自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用户显示字段,并获得其提交的内容。\n# 发送(POST)至此模块,提供<var>$1returnurl</var>及任何相关字段。\n# 在响应中检查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>(成功)或<samp>FAIL</samp>(失败),则认为操作结束。成功与否如上句所示。\n#* 如果您收到了<samp>UI</samp>,向用户显示新字段,并再次获取其提交的内容。然后再次使用<var>$1continue</var>,向本模块提交相关字段,并重复第四步。\n#* 如果您收到了<samp>REDIRECT</samp>,将用户指向<samp>redirecttarget</samp>中的目标,等待其返回<var>$1returnurl</var>。然后再次使用<var>$1continue</var>,向本模块提交返回URL中提供的一切字段,并重复第四步。\n#* 如果您收到了<samp>RESTART</samp>,这意味着身份验证正常运作,但我们没有链接的用户账户。您可以将此看做<samp>UI</samp>或<samp>FAIL</samp>。",
        "api-help-authmanagerhelper-requests": "只使用这些身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>,或来自此模块之前的响应。",
        "api-help-authmanagerhelper-request": "使用此身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>。",
        "api-help-authmanagerhelper-messageformat": "返回消息使用的格式。",
        "apierror-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-invalidexpiry": "无效的过期时间“$1”。",
        "apierror-invalid-file-key": "不是有效的文件关键词。",
        "apierror-invalidlang": "用于参数<var>$1</var>的语言值无效。",
-       "apierror-invalidoldimage": "旧图片参数有无效格式。",
+       "apierror-invalidoldimage": "<var>oldimage</var>参数有无效格式。",
        "apierror-invalidparammix-cannotusewith": "<kbd>$1</kbd>参数不能与<kbd>$2</kbd>一起使用。",
        "apierror-invalidparammix-mustusewith": "<kbd>$1</kbd>参数只能与<kbd>$2</kbd>一起使用。",
        "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd>不能连同<var>oldid</var>、<var>pageid</var>或<var>page</var>参数使用。请使用<var>title</var>和<var>text</var>。",
        "apierror-invalidparammix": "{{PLURAL:$2|参数}}$1不能一起使用。",
-       "apierror-invalidsection": "章节参数必须为有效的章节ID或<kbd>new</kbd>。",
+       "apierror-invalidsection": "<var>section</var>参数必须为有效的章节ID或<kbd>new</kbd>。",
        "apierror-invalidsha1base36hash": "提供的SHA1Base36哈希无效。",
        "apierror-invalidsha1hash": "提供的SHA1哈希无效。",
        "apierror-invalidtitle": "错误标题“$1”。",
        "apierror-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-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-show": "不正确的参数——不可提供互斥值。",
        "apierror-siteinfo-includealldenied": "除非<var>$wgShowHostNames</var>为真,否则不能查看所有服务器的信息。",
        "apierror-sizediffdisabled": "大小差异在Miser模式中被禁用。",
-       "apierror-spamdetected": "您的编辑被拒绝,因为它包含破坏性碎片:<code>$1</code>。",
+       "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": "无效暂存文件。",
        "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-parse-nocontentmodel": "<var>title</var>或<var>contentmodel</var>未提供,假设$1。",
        "apiwarn-parse-titlewithouttext": "<var>title</var>在没有<var>text</var>的情况下被使用,并且请求了已解析页面的属性。您是想用<var>page</var>而不是<var>title</var>么?",
        "apiwarn-tokennotallowed": "操作“$1”不允许当前用户使用。",
-       "apiwarn-toomanyvalues": "参数<var>$1</var>指定了太多的值:上限为$2。",
-       "apiwarn-unclearnowtimestamp": "为时间戳参数<var>$1</var>传递“$2”已被弃用。如因某些原因您需要明确指定当前时间而不计算客户端,请使用<kbd>now<kbd>。",
+       "apiwarn-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-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..6f2bcd6 100644 (file)
@@ -7,12 +7,23 @@
                        "EagerLin",
                        "Zhxy 519",
                        "Macofe",
-                       "Jasonzhuocn"
+                       "Jasonzhuocn",
+                       "Winstonyin",
+                       "Arthur2e5",
+                       "烈羽"
                ]
        },
-       "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-expandtemplates-param-text": "要轉換的 Wikitext。",
        "apihelp-feedcontributions-description": "回傳使用者貢獻 Feed。",
        "apihelp-feedcontributions-param-feedformat": "Feed 的格式。",
+       "apihelp-feedcontributions-param-hideminor": "隱藏小修改。",
        "apihelp-feedcontributions-param-showsizediff": "顯示修訂版本之間的差異大小。",
        "apihelp-feedcontributions-example-simple": "返回使用者<kbd>Example</kbd>的貢獻。",
        "apihelp-feedrecentchanges-description": "返回最近變更摘要。",
        "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": "重設所有偏好設定",
        "api-help-examples": "{{PLURAL:$1|範例}}:",
        "api-help-permissions": "{{PLURAL:$1|權限}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|已授權給}}: $2",
+       "api-help-authmanager-general-usage": "使用此模組的一般程式是:\n# 通過<kbd>amirequestsfor=$4</kbd>取得來自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用欄位,和來自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用戶顯示欄位,並獲得其提交的內容。\n# 提交(POST)至此模組,提供<var>$1returnurl</var>及任何相關欄位。\n# 在回应中檢查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>(成功)或<samp>FAIL</samp>(失敗),則認為操作結束。成功與否如上句所示。\n#* 如果您收到了<samp>UI</samp>,向用戶顯示新欄位,並再次獲取其提交的內容。然後再次使用<var>$1continue</var>,向本模組提交相關欄位,並重復第四步。\n#* 如果您收到了<samp>REDIRECT</samp>,將使用者指向<samp>redirecttarget</samp>中的目標,等待其返回<var>$1returnurl</var>。然後再次使用<var>$1continue</var>,向本模組提交返回URL中提供的一切欄位,並重復第四步。\n#* 如果您收到了<samp>RESTART</samp>,這意味著身份驗證正常運作,但我們沒有連結的使用者賬戶。您可以將此看做<samp>UI</samp>或<samp>FAIL</samp>。",
        "api-credits-header": "製作群",
        "api-credits": "API 開發人員:\n* Roan Kattouw (首席開發者 Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (創立者,首席開發者 Sep 2006–Sep 2007)\n* Brad Jorsch (首席開發者 2013–present)\n\n請傳送您的評論、建議以及問題至 mediawiki-api@lists.wikimedia.org\n或者回報問題至 https://phabricator.wikimedia.org/。"
 }
index 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 9e6cf1e..0a07a93 100644 (file)
@@ -26,6 +26,9 @@
  * @copyright © 2011, Antoine Musso
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
+
 /**
  * Class for fetching backlink lists, approximate backlink counts and
  * partitions. This is a shared cache.
@@ -407,7 +410,7 @@ class BacklinkCache {
 
                // 4) ... finally fetch from the slow database :(
                $cacheEntry = [ 'numRows' => 0, 'batches' => [] ]; // final result
-               // Do the selects in batches to avoid client-side OOMs (bug 43452).
+               // Do the selects in batches to avoid client-side OOMs (T45452).
                // Use a LIMIT that plays well with $batchSize to keep equal sized partitions.
                $selectSize = max( $batchSize, 200000 - ( 200000 % $batchSize ) );
                $start = false;
index 6d5f8c3..0a302b6 100644 (file)
@@ -242,7 +242,7 @@ abstract class FileCacheBase {
                                : IP::sanitizeRange( "$ip/16" );
 
                        # Bail out if a request already came from this range...
-                       $key = wfMemcKey( get_class( $this ), 'attempt', $this->mType, $this->mKey, $ip );
+                       $key = wfMemcKey( static::class, 'attempt', $this->mType, $this->mKey, $ip );
                        if ( $cache->get( $key ) ) {
                                return; // possibly the same user
                        }
@@ -272,6 +272,6 @@ abstract class FileCacheBase {
         * @return string
         */
        protected function cacheMissKey() {
-               return wfMemcKey( get_class( $this ), 'misses', $this->mType, $this->mKey );
+               return wfMemcKey( static::class, 'misses', $this->mType, $this->mKey );
        }
 }
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 d773fff..77ab2d5 100644 (file)
@@ -22,6 +22,7 @@
  */
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * Class representing a list of titles
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 90ad241..5d48c03 100644 (file)
@@ -110,9 +110,6 @@ class MessageBlobStore implements LoggerAwareInterface {
                foreach ( $modules as $name => $module ) {
                        $key = $cacheKeys[$name];
                        if ( !isset( $result[$key] ) || $curTTLs[$key] === null || $curTTLs[$key] < 0 ) {
-                               $this->logger->info( 'Message blob cache-miss for {module}',
-                                       [ 'module' => $name, 'cacheKey' => $key ]
-                               );
                                $blobs[$name] = $this->recacheMessageBlob( $key, $module, $lang );
                        } else {
                                // Use unexpired cache
index 0aca213..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,24 +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( BagOStuff $memCached, $useDB, $expiry ) {
-               global $wgUseLocalMessageCache;
+       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();
        }
 
        /**
@@ -203,7 +210,7 @@ class MessageCache {
        protected function getLocalCache( $code ) {
                $cacheKey = wfMemcKey( __CLASS__, $code );
 
-               return $this->localCache->get( $cacheKey );
+               return $this->srvCache->get( $cacheKey );
        }
 
        /**
@@ -214,7 +221,7 @@ class MessageCache {
         */
        protected function saveToLocalCache( $code, $cache ) {
                $cacheKey = wfMemcKey( __CLASS__, $code );
-               $this->localCache->set( $cacheKey, $cache );
+               $this->srvCache->set( $cacheKey, $cache );
        }
 
        /**
@@ -300,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 ) ) {
@@ -381,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';
@@ -424,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";
@@ -444,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 );
@@ -518,7 +523,7 @@ class MessageCache {
                                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;
@@ -541,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;
@@ -557,63 +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. 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
-               $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
+               );
        }
 
        /**
@@ -648,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;
@@ -720,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__ );
        }
 
        /**
@@ -845,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;
@@ -950,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 ) === ' ' ) {
@@ -963,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 90b3de1..cbff113 100644 (file)
@@ -228,7 +228,7 @@ class LocalisationCache {
                        }
                }
 
-               wfDebugLog( 'caches', get_class( $this ) . ": using store $storeClass" );
+               wfDebugLog( 'caches', static::class . ": using store $storeClass" );
                if ( !empty( $conf['storeDirectory'] ) ) {
                        $storeConf['directory'] = $conf['storeDirectory'];
                }
index 15a00c7..cffb59a 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Feed to Special:RecentChanges and Special:RecentChangesLiked
  *
@@ -152,7 +154,7 @@ class ChangesFeed {
                        if ( $feedAge < $wgFeedCacheTimeout || $feedLastmodUnix > $lastmodUnix ) {
                                wfDebug( "RC: loading feed from cache ($key; $feedLastmod; $lastmod)...\n" );
                                if ( $feedLastmodUnix < $lastmodUnix ) {
-                                       $wgOut->setLastModified( $feedLastmod ); // bug 21916
+                                       $wgOut->setLastModified( $feedLastmod ); // T23916
                                }
                                return $cache->get( $key );
                        } else {
index 77038ed..3f4ad14 100644 (file)
@@ -23,6 +23,7 @@
  */
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 class ChangesList extends ContextSource {
        /**
@@ -158,19 +159,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 +404,7 @@ class ChangesList extends ContextSource {
                        $diffLink = $this->linkRenderer->makeKnownLink(
                                $rc->getTitle(),
                                new HtmlArmor( $this->message['diff'] ),
-                               [],
+                               [ 'class' => 'mw-changeslist-diff' ],
                                $query
                        );
                }
@@ -391,7 +416,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 +469,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..3aad60e 100644 (file)
@@ -358,16 +358,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> ';
 
@@ -530,7 +531,7 @@ class EnhancedChangesList extends ChangesList {
                                $links['total-changes'] = $this->linkRenderer->makeKnownLink(
                                        $block0->getTitle(),
                                        new HtmlArmor( $nchanges[$n] ),
-                                       [],
+                                       [ 'class' => 'mw-changeslist-groupdiff' ],
                                        $queryParams + [
                                                'diff' => $currentRevision,
                                                'oldid' => $last->mAttribs['rc_last_oldid'],
@@ -540,7 +541,7 @@ class EnhancedChangesList extends ChangesList {
                                        $links['total-changes-since-last'] = $this->linkRenderer->makeKnownLink(
                                                        $block0->getTitle(),
                                                        new HtmlArmor( $sinceLastVisitMsg[$sinceLast] ),
-                                                       [],
+                                                       [ 'class' => 'mw-changeslist-groupdiff' ],
                                                        $queryParams + [
                                                                'diff' => $currentRevision,
                                                                'oldid' => $unvisitedOldid,
@@ -562,7 +563,7 @@ class EnhancedChangesList extends ChangesList {
                        $links['history'] = $this->linkRenderer->makeKnownLink(
                                        $block0->getTitle(),
                                        new HtmlArmor( $this->message['enhancedrc-history'] ),
-                                       [],
+                                       [ 'class' => 'mw-changeslist-history' ],
                                        $params
                                );
                }
@@ -717,7 +718,7 @@ class EnhancedChangesList extends ChangesList {
                                        . $this->linkRenderer->makeKnownLink(
                                                $pageTitle,
                                                new HtmlArmor( $this->message['hist'] ),
-                                               [],
+                                               [ 'class' => 'mw-changeslist-history' ],
                                                $query
                                        ) )->escaped();
                return $retVal;
index 8eb06ce..a5d5191 100644 (file)
@@ -34,7 +34,7 @@ class OldChangesList extends ChangesList {
        public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
 
                $classes = $this->getHTMLClasses( $rc, $watched );
-               // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
+               // use mw-line-even/mw-line-odd class only if linenumber is given (feature from T16468)
                if ( $linenumber ) {
                        if ( $linenumber & 1 ) {
                                $classes[] = 'mw-line-odd';
@@ -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 2c5c8b1..8ce21f5 100644 (file)
@@ -186,7 +186,7 @@ class RCCacheEntryFactory {
                        $curLink = $curMessage;
                } else {
                        $curUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
-                       $curLink = "<a href=\"$curUrl\">$curMessage</a>";
+                       $curLink = "<a class=\"mw-changeslist-diff-cur\" href=\"$curUrl\">$curMessage</a>";
                }
 
                return $curLink;
@@ -229,16 +229,18 @@ class RCCacheEntryFactory {
                                return $diffMessage;
                        }
                        $diffUrl = htmlspecialchars( $pageTitle->getLinkURL( $queryParams ) );
-                       $diffLink = "<a href=\"$diffUrl\">$diffMessage</a>";
+                       $diffLink = "<a class=\"mw-changeslist-diff\" href=\"$diffUrl\">$diffMessage</a>";
                } else {
                        $diffUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
-                       $diffLink = "<a href=\"$diffUrl\">$diffMessage</a>";
+                       $diffLink = "<a class=\"mw-changeslist-diff\" href=\"$diffUrl\">$diffMessage</a>";
                }
 
                return $diffLink;
        }
 
        /**
+        * Builds the link to the previous version
+        *
         * @param RecentChange $cacheEntry
         * @param bool $showDiffLinks
         *
@@ -257,7 +259,7 @@ class RCCacheEntryFactory {
                        $lastLink = $this->linkRenderer->makeKnownLink(
                                $cacheEntry->getTitle(),
                                new HtmlArmor( $lastMessage ),
-                               [],
+                               [ 'class' => 'mw-changeslist-diff' ],
                                $this->buildDiffQueryParams( $cacheEntry )
                        );
                }
index 81f64a8..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 );
        }
 
        /**
index bfabd51..d2239eb 100644 (file)
@@ -757,11 +757,13 @@ class ChangeTags {
         * @param User $user Who to attribute the action to
         * @param int $tagCount For deletion only, how many usages the tag had before
         * it was deleted.
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return int ID of the inserted log entry
         * @since 1.25
         */
        protected static function logTagManagementAction( $action, $tag, $reason,
-               User $user, $tagCount = null ) {
+               User $user, $tagCount = null, array $logEntryTags = [] ) {
 
                $dbw = wfGetDB( DB_MASTER );
 
@@ -778,6 +780,7 @@ class ChangeTags {
                }
                $logEntry->setParameters( $params );
                $logEntry->setRelations( [ 'Tag' => $tag ] );
+               $logEntry->setTags( $logEntryTags );
 
                $logId = $logEntry->insert( $dbw );
                $logEntry->publish( $logId );
@@ -830,12 +833,14 @@ class ChangeTags {
         * @param string $reason
         * @param User $user Who to give credit for the action
         * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return Status If successful, the Status contains the ID of the added log
         * entry as its value
         * @since 1.25
         */
        public static function activateTagWithChecks( $tag, $reason, User $user,
-               $ignoreWarnings = false ) {
+               $ignoreWarnings = false, array $logEntryTags = [] ) {
 
                // are we allowed to do this?
                $result = self::canActivateTag( $tag, $user );
@@ -848,7 +853,9 @@ class ChangeTags {
                self::defineTag( $tag );
 
                // log it
-               $logId = self::logTagManagementAction( 'activate', $tag, $reason, $user );
+               $logId = self::logTagManagementAction( 'activate', $tag, $reason, $user,
+                       null, $logEntryTags );
+
                return Status::newGood( $logId );
        }
 
@@ -889,12 +896,14 @@ class ChangeTags {
         * @param string $reason
         * @param User $user Who to give credit for the action
         * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return Status If successful, the Status contains the ID of the added log
         * entry as its value
         * @since 1.25
         */
        public static function deactivateTagWithChecks( $tag, $reason, User $user,
-               $ignoreWarnings = false ) {
+               $ignoreWarnings = false, array $logEntryTags = [] ) {
 
                // are we allowed to do this?
                $result = self::canDeactivateTag( $tag, $user );
@@ -907,7 +916,9 @@ class ChangeTags {
                self::undefineTag( $tag );
 
                // log it
-               $logId = self::logTagManagementAction( 'deactivate', $tag, $reason, $user );
+               $logId = self::logTagManagementAction( 'deactivate', $tag, $reason, $user,
+                       null, $logEntryTags );
+
                return Status::newGood( $logId );
        }
 
@@ -968,12 +979,14 @@ class ChangeTags {
         * @param string $reason
         * @param User $user Who to give credit for the action
         * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return Status If successful, the Status contains the ID of the added log
         * entry as its value
         * @since 1.25
         */
        public static function createTagWithChecks( $tag, $reason, User $user,
-               $ignoreWarnings = false ) {
+               $ignoreWarnings = false, array $logEntryTags = [] ) {
 
                // are we allowed to do this?
                $result = self::canCreateTag( $tag, $user );
@@ -986,7 +999,9 @@ class ChangeTags {
                self::defineTag( $tag );
 
                // log it
-               $logId = self::logTagManagementAction( 'create', $tag, $reason, $user );
+               $logId = self::logTagManagementAction( 'create', $tag, $reason, $user,
+                       null, $logEntryTags );
+
                return Status::newGood( $logId );
        }
 
@@ -1095,12 +1110,14 @@ class ChangeTags {
         * @param string $reason
         * @param User $user Who to give credit for the action
         * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return Status If successful, the Status contains the ID of the added log
         * entry as its value
         * @since 1.25
         */
        public static function deleteTagWithChecks( $tag, $reason, User $user,
-               $ignoreWarnings = false ) {
+               $ignoreWarnings = false, array $logEntryTags = [] ) {
 
                // are we allowed to do this?
                $result = self::canDeleteTag( $tag, $user );
@@ -1120,7 +1137,9 @@ class ChangeTags {
                }
 
                // log it
-               $logId = self::logTagManagementAction( 'delete', $tag, $reason, $user, $hitcount );
+               $logId = self::logTagManagementAction( 'delete', $tag, $reason, $user,
+                       $hitcount, $logEntryTags );
+
                $deleteResult->value = $logId;
                return $deleteResult;
        }
index 7659d6c..d67bc7e 100644 (file)
@@ -67,7 +67,7 @@ abstract class Collation {
                                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] );
                                }
 
index 5dc9fa2..ca7b765 100644 (file)
@@ -19,7 +19,7 @@
  */
 
 /**
- * Workaround for incorrect collation of Estonian language ('et') in ICU (bug 54168).
+ * Workaround for incorrect collation of Estonian language ('et') in ICU (T56168).
  *
  * 'W' and 'V' should not be considered the same letter for the purposes of collation in modern
  * Estonian. We work around this by replacing 'W' and 'w' with 'ᴡ' U+1D21 'LATIN LETTER SMALL
index b7e45cc..9cce087 100644 (file)
  */
 
 /**
- * Temporary workaround for incorrect collation of Persian language ('fa') in ICU (bug T139110).
+ * Temporary workaround for incorrect collation of Persian language ('fa') in ICU 52 (bug T139110).
  *
- * 'ا' and 'و' should not be considered the same letter for the purposes of collation in Persian.
+ * 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
  */
@@ -34,11 +37,14 @@ class CollationFa extends IcuCollation {
        }
 
        public function getPrimarySortKey( $string ) {
-               $firstLetter = mb_substr( $string, 0, 1 );
-               if ( $firstLetter === 'و' || $firstLetter === 'ا' ) {
+               $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 parent::getPrimarySortKey( $string );
+               return $primary;
        }
 }
index bc5a209..e0eb1c1 100644 (file)
@@ -330,7 +330,7 @@ class IcuCollation extends Collation {
                        $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
                        $cacheKey = $cache->makeKey(
                                'first-letters',
-                               get_class( $this ),
+                               static::class,
                                $this->locale,
                                $this->digitTransformLanguage->getCode(),
                                self::getICUVersion(),
@@ -513,8 +513,12 @@ class IcuCollation extends Collation {
         * can't be determined.
         *
         * The constant INTL_ICU_VERSION this function refers to isn't really
-        * documented. It is available since PHP 5.3.7 (see PHP bug 54561).
-        * This function will return false on older PHPs.
+        * documented. It is available since PHP 5.3.7 (see PHP 54561
+        * https://bugs.php.net/bug.php?id=54561). This function will return
+        * false on older PHPs.
+        *
+        * TODO: Remove the backwards-compatibility as MediaWiki now requires
+        * higher levels of PHP.
         *
         * @since 1.21
         * @return string|bool
diff --git a/includes/compat/Timestamp.php b/includes/compat/Timestamp.php
new file mode 100644 (file)
index 0000000..bd25432
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+// This file is loaded by composer.json#autoload.files instead of autoload.php,
+// because PHP's class loader does not support autoloading an alias for a class that
+// isn't already loaded. See also AutoLoaderTest and ClassCollector.
+
+// By using an autoload file, this will trigger directly at runtime outside any class
+// loading context. This file will then register the alias and, as class_alias() does
+// by default, it will trigger a plain autoload for the destination class.
+
+// The below uses string concatenation for the alias to avoid being seen by ClassCollector,
+// which would insist on adding it to autoload.php, after which AutoLoaderTest will
+// complain about class_alias() not being in the target class file.
+
+/**
+ * @deprecated since 1.29
+ * @since 1.20
+ */
+class_alias( Wikimedia\Timestamp\TimestampException::class, 'Timestamp' . 'Exception' );
index db20f51..bccb147 100644 (file)
@@ -198,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
@@ -213,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':
@@ -367,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() {
@@ -903,7 +899,7 @@ abstract class ContentHandler {
                        $onlyAuthor = $row->rev_user_text;
                        // Try to find a second contributor
                        foreach ( $res as $row ) {
-                               if ( $row->rev_user_text != $onlyAuthor ) { // Bug 22999
+                               if ( $row->rev_user_text != $onlyAuthor ) { // T24999
                                        $onlyAuthor = false;
                                        break;
                                }
@@ -1095,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
         *
@@ -1169,7 +1106,6 @@ abstract class ContentHandler {
                        'category',
                        SearchIndexField::INDEX_TYPE_TEXT
                );
-
                $fields['category']->setFlag( SearchIndexField::FLAG_CASEFOLD );
 
                $fields['external_link'] = $engine->makeSearchFieldMapping(
@@ -1186,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;
        }
 
@@ -1217,8 +1157,11 @@ abstract class ContentHandler {
         * @return array Map of name=>value for fields
         * @since 1.28
         */
-       public function getDataForSearchIndex( WikiPage $page, ParserOutput $output,
-                                              SearchEngine $engine ) {
+       public function getDataForSearchIndex(
+               WikiPage $page,
+               ParserOutput $output,
+               SearchEngine $engine
+       ) {
                $fieldData = [];
                $content = $page->getContent();
 
@@ -1235,6 +1178,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 26f1190..843d540 100644 (file)
@@ -30,8 +30,11 @@ class FileContentHandler extends WikitextContentHandler  {
                return $fields;
        }
 
-       public function getDataForSearchIndex( WikiPage $page, ParserOutput $parserOutput,
-                                              SearchEngine $engine ) {
+       public function getDataForSearchIndex(
+               WikiPage $page,
+               ParserOutput $parserOutput,
+               SearchEngine $engine
+       ) {
                $fields = [];
 
                $title = $page->getTitle();
index 09cdcee..698a37b 100644 (file)
@@ -30,7 +30,7 @@
  */
 class TextContentHandler extends ContentHandler {
 
-       // @codingStandardsIgnoreStart bug 57585
+       // @codingStandardsIgnoreStart T59585
        public function __construct( $modelId = CONTENT_MODEL_TEXT, $formats = [ CONTENT_FORMAT_TEXT ] ) {
                parent::__construct( $modelId, $formats );
        }
@@ -150,8 +150,11 @@ class TextContentHandler extends ContentHandler {
                return $fields;
        }
 
-       public function getDataForSearchIndex( WikiPage $page, ParserOutput $output,
-                                              SearchEngine $engine ) {
+       public function getDataForSearchIndex(
+               WikiPage $page,
+               ParserOutput $output,
+               SearchEngine $engine
+       ) {
                $fields = parent::getDataForSearchIndex( $page, $output, $engine );
                $fields['language'] =
                        $this->getPageLanguage( $page->getTitle(), $page->getContent() )->getCode();
index f4a6dc6..9f79aa8 100644 (file)
@@ -27,26 +27,32 @@ class WikiTextStructure {
         * @var string[] selectors to elements that are excluded entirely from search
         */
        private $excludedElementSelectors = [
-               'audio', 'video',       // "it looks like you don't have javascript enabled..."
-                                       // do not need to index
-               'sup.reference',        // The [1] for references
-               '.mw-cite-backlink',    // The ↑ next to references in the references section
-               'h1', 'h2', 'h3',       // Headings are already indexed in their own field.
-               'h5', 'h6', 'h4',
-               '.autocollapse',        // Collapsed fields are hidden by default so we don't want them
-                                                               // showing up.
+               // "it looks like you don't have javascript enabled..." – do not need to index
+               'audio', 'video',
+               // The [1] for references
+               'sup.reference',
+               // The ↑ next to references in the references section
+               '.mw-cite-backlink',
+               // Headings are already indexed in their own field.
+               'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
+               // Collapsed fields are hidden by default so we don't want them showing up.
+               '.autocollapse',
        ];
 
        /**
         * @var string[] selectors to elements that are considered auxiliary to article text for search
         */
        private $auxiliaryElementSelectors = [
-               '.thumbcaption',        // Thumbnail captions aren't really part of the text proper
-               'table',                // Neither are tables
-               '.rellink',             // Common style for "See also:".
-               '.dablink',             // Common style for calling out helpful links at the top
-                                                               // of the article.
-               '.searchaux',           // New class users can use to mark stuff as auxiliary to searches.
+               // Thumbnail captions aren't really part of the text proper
+               '.thumbcaption',
+               // Neither are tables
+               'table',
+               // Common style for "See also:".
+               '.rellink',
+               // Common style for calling out helpful links at the top of the article.
+               '.dablink',
+               // New class users can use to mark stuff as auxiliary to searches.
+               '.searchaux',
        ];
 
        /**
index 74b2f1a..9c26ae1 100644 (file)
@@ -128,16 +128,20 @@ class WikitextContentHandler extends TextContentHandler {
 
                $fields['opening_text'] =
                        $engine->makeSearchFieldMapping( 'opening_text', SearchIndexField::INDEX_TYPE_TEXT );
-               $fields['opening_text']->setFlag( SearchIndexField::FLAG_SCORING |
-                                                 SearchIndexField::FLAG_NO_HIGHLIGHT );
+               $fields['opening_text']->setFlag(
+                       SearchIndexField::FLAG_SCORING | SearchIndexField::FLAG_NO_HIGHLIGHT
+               );
                // Until we have full first-class content handler for files, we invoke it explicitly here
                $fields = array_merge( $fields, $this->getFileHandler()->getFieldsForSearchIndex( $engine ) );
 
                return $fields;
        }
 
-       public function getDataForSearchIndex( WikiPage $page, ParserOutput $parserOutput,
-                                              SearchEngine $engine ) {
+       public function getDataForSearchIndex(
+               WikiPage $page,
+               ParserOutput $parserOutput,
+               SearchEngine $engine
+       ) {
                $fields = parent::getDataForSearchIndex( $page, $parserOutput, $engine );
 
                $structure = new WikiTextStructure( $parserOutput );
index 829dd73..ea5278f 100644 (file)
@@ -39,7 +39,7 @@ abstract class ContextSource implements IContextSource {
         */
        public function getContext() {
                if ( $this->context === null ) {
-                       $class = get_class( $this );
+                       $class = static::class;
                        wfDebug( __METHOD__ . " ($class): called and \$context is null. " .
                                "Using RequestContext::getMain() for sanity\n" );
                        $this->context = RequestContext::getMain();
index ecd274b..3dfa456 100644 (file)
@@ -428,7 +428,7 @@ class RequestContext implements IContextSource, MutableContext {
                                }
 
                                // Normalize the key in case the user is passing gibberish
-                               // or has old preferences (bug 69566).
+                               // or has old preferences (T71566).
                                $normalized = Skin::normalizeKey( $userSkin );
 
                                // Skin::normalizeKey will also validate it, so
index 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 2b394b6..c4921e2 100644 (file)
@@ -79,7 +79,7 @@ class CloneDatabase {
                foreach ( $this->tablesToClone as $tbl ) {
                        if ( $wgSharedDB && in_array( $tbl, $wgSharedTables, true ) ) {
                                // Shared tables don't work properly when cloning due to
-                               // how prefixes are handled (bug 65654)
+                               // how prefixes are handled (T67654)
                                throw new RuntimeException( "Cannot clone shared table $tbl." );
                        }
                        # Clean up from previous aborted run.  So that table escaping
diff --git a/includes/db/DatabaseMssql.php b/includes/db/DatabaseMssql.php
deleted file mode 100644 (file)
index 7c4bb3b..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 Database {
-       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|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 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 c3502f6..ef5a8fe 100644 (file)
  * @file
  * @ingroup Database
  */
-
-/**
- * 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;
-       }
-}
+use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * @ingroup Database
@@ -668,7 +563,7 @@ class DatabaseOracle extends Database {
                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 );
                }
@@ -998,7 +893,7 @@ class DatabaseOracle extends Database {
        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 +980,18 @@ class DatabaseOracle extends Database {
                }
        }
 
-       /**
-        * 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 40418fd..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
@@ -58,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
@@ -71,7 +75,13 @@ 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' )
+                                               ];
                                        }
+
                                        if ( in_array( $server['type'], $typesWithSchema, true ) ) {
                                                $server += [ 'schema' => $mainConfig->get( 'DBmwschema' ) ];
                                        }
@@ -111,6 +121,9 @@ abstract class MWLBFactory {
                                        $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 ];
                        }
@@ -171,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 87656f2..e67a0b3 100644 (file)
@@ -370,7 +370,7 @@ class MWDebug {
                                | [\xF0-\xF4](?![\x80-\xBF]{3}) # Invalid UTF-8 Sequence Start
                                | (?<=[\x0-\x7F\xF5-\xFF])[\x80-\xBF] # Invalid UTF-8 Sequence Middle
                                | (?<![\xC2-\xDF]|[\xE0-\xEF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4]
-                                  |[\xF0-\xF4][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF]{2})[\x80-\xBF] # Overlong Sequence
+                                       | [\xF0-\xF4][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF]{2})[\x80-\xBF] # Overlong Sequence
                                | (?<=[\xE0-\xEF])[\x80-\xBF](?![\x80-\xBF]) # Short 3 byte sequence
                                | (?<=[\xF0-\xF4])[\x80-\xBF](?![\x80-\xBF]{2}) # Short 4 byte sequence
                                | (?<=[\xF0-\xF4][\x80-\xBF])[\x80-\xBF](?![\x80-\xBF]) # Short 4 byte sequence (2)
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 432a9e1..6670fe9 100644 (file)
@@ -33,12 +33,12 @@ use Psr\Log\LoggerInterface;
  *
  * Constructor options array arguments:
  * * alias: map from monolog channel to kafka topic name. When no
- *       alias exists the topic "monolog_$channel" will be used.
+ *   alias exists the topic "monolog_$channel" will be used.
  * * swallowExceptions: Swallow exceptions that occur while talking to
- *    kafka. Defaults to false.
+ *   kafka. Defaults to false.
  * * logExceptions: Log exceptions talking to kafka here. Either null,
- *    the name of a channel to log to, or an object implementing
- *    FormatterInterface. Defaults to null.
+ *   the name of a channel to log to, or an object implementing
+ *   FormatterInterface. Defaults to null.
  *
  * Requires the nmred/kafka-php library, version >= 1.3.0
  *
index 553cbf6..09ed755 100644 (file)
@@ -6,6 +6,7 @@ namespace MediaWiki\Logger\Monolog;
  * LogstashFormatter squashes the base message array and the context and extras subarrays into one.
  * This can result in unfortunately named context fields overwriting other data (T145133).
  * This class modifies the standard LogstashFormatter to rename such fields and flag the message.
+ * Also changes exception JSON-ification which is done poorly by the standard class.
  *
  * Compatible with Monolog 1.x only.
  *
@@ -80,4 +81,31 @@ class LogstashFormatter extends \Monolog\Formatter\LogstashFormatter {
                }
                return $fields;
        }
+
+       /**
+        * Use a more user-friendly trace format than NormalizerFormatter
+        * @param \Exception|\Throwable $e
+        * @return array
+        */
+       protected function normalizeException( $e ) {
+               if ( !$e instanceof \Exception && !$e instanceof \Throwable ) {
+                       throw new \InvalidArgumentException( 'Exception/Throwable expected, got '
+                               . gettype( $e ) . ' / ' . get_class( $e ) );
+               }
+
+               $data = [
+                       'class' => get_class( $e ),
+                       'message' => $e->getMessage(),
+                       'code' => $e->getCode(),
+                       'file' => $e->getFile() . ':' . $e->getLine(),
+                       'trace' => \MWExceptionHandler::getRedactedTraceAsString( $e ),
+               ];
+
+               $previous = $e->getPrevious();
+               if ( $previous ) {
+                       $data['previous'] = $this->normalizeException( $previous );
+               }
+
+               return $data;
+       }
 }
index 1ba6c1f..0a9755d 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\LBFactory;
+use Wikimedia\Rdbms\LoadBalancer;
 
 /**
  * Class for managing the deferred updates
@@ -334,6 +336,21 @@ class DeferredUpdates {
                return count( self::$preSendUpdates ) + count( self::$postSendUpdates );
        }
 
+       /**
+        * @param integer $stage DeferredUpdates constant (PRESEND, POSTSEND, or ALL)
+        * @since 1.29
+        */
+       public static function getPendingUpdates( $stage = self::ALL ) {
+               $updates = [];
+               if ( $stage === self::ALL || $stage === self::PRESEND ) {
+                       $updates = array_merge( $updates, self::$preSendUpdates );
+               }
+               if ( $stage === self::ALL || $stage === self::POSTSEND ) {
+                       $updates = array_merge( $updates, self::$postSendUpdates );
+               }
+               return $updates;
+       }
+
        /**
         * Clear all pending updates without performing them. Generally, you don't
         * want or need to call this. Unit tests need it though.
index 229a9a2..0133f19 100644 (file)
@@ -145,7 +145,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
                        # If the sortkey is longer then 255 bytes,
                        # it truncated by DB, and then doesn't get
                        # matched when comparing existing vs current
-                       # categories, causing bug 25254.
+                       # categories, causing T27254.
                        # Also. substr behaves weird when given "".
                        if ( $sortkey !== '' ) {
                                $sortkey = substr( $sortkey, 0, 255 );
@@ -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 559a5ec..148e50c 100644 (file)
@@ -82,7 +82,7 @@ class DifferenceEngine extends ContextSource {
        /**
         * Set this to true to add debug info to the HTML output.
         * Warning: this may cause RSS readers to spuriously mark articles as "new"
-        * (bug 20601)
+        * (T22601)
         */
        public $enableDebugComment = false;
 
@@ -762,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' );
@@ -982,7 +985,7 @@ class DifferenceEngine extends ContextSource {
        public function localiseLineNumbers( $text ) {
                return preg_replace_callback(
                        '/<!--LINE (\d+)-->/',
-                       [ &$this, 'localiseLineNumbersCb' ],
+                       [ $this, 'localiseLineNumbersCb' ],
                        $text
                );
        }
index a26775f..ad80275 100644 (file)
@@ -46,11 +46,9 @@ class WordAccumulator {
        private function flushGroup( $new_tag ) {
                if ( $this->group !== '' ) {
                        if ( $this->tag == 'ins' ) {
-                               $this->line .= "<ins{$this->insClass}>" .
-                                                          htmlspecialchars( $this->group ) . '</ins>';
+                               $this->line .= "<ins{$this->insClass}>" . htmlspecialchars( $this->group ) . '</ins>';
                        } elseif ( $this->tag == 'del' ) {
-                               $this->line .= "<del{$this->delClass}>" .
-                                                          htmlspecialchars( $this->group ) . '</del>';
+                               $this->line .= "<del{$this->delClass}>" . htmlspecialchars( $this->group ) . '</del>';
                        } else {
                                $this->line .= htmlspecialchars( $this->group );
                        }
index 9b5a268..2bed87a 100644 (file)
@@ -39,7 +39,7 @@ class ErrorPageError extends MWException implements ILocalizedException {
                $this->msg = $msg;
                $this->params = $params;
 
-               // Bug 44111: Messages in the log files should be in English and not
+               // T46111: Messages in the log files should be in English and not
                // customized by the local wiki. So get the default English version for
                // passing to the parent constructor. Our overridden report() below
                // makes sure that the page shown to the user is not forced to English.
index e958c94..4ff8636 100644 (file)
@@ -112,7 +112,7 @@ class MWException extends Exception {
                        "</p>\n";
                } else {
                        $logId = WebRequest::getRequestId();
-                       $type = get_class( $this );
+                       $type = static::class;
                        return "<div class=\"errorbox\">" .
                        '[' . $logId . '] ' .
                        gmdate( 'Y-m-d H:i:s' ) . ": " .
@@ -164,7 +164,7 @@ class MWException extends Exception {
                if ( $this->useOutputPage() ) {
                        $wgOut->prepareErrorPage( $this->getPageTitle() );
 
-                       $hookResult = $this->runHooks( get_class( $this ) );
+                       $hookResult = $this->runHooks( static::class );
                        if ( $hookResult ) {
                                $wgOut->addHTML( $hookResult );
                        } else {
@@ -183,7 +183,7 @@ class MWException extends Exception {
                                '<style>body { font-family: sans-serif; margin: 0; padding: 0.5em 2em; }</style>' .
                                "</head><body>\n";
 
-                       $hookResult = $this->runHooks( get_class( $this ) . 'Raw' );
+                       $hookResult = $this->runHooks( static::class . 'Raw' );
                        if ( $hookResult ) {
                                echo $hookResult;
                        } else {
@@ -203,7 +203,7 @@ class MWException extends Exception {
 
                if ( defined( 'MW_API' ) ) {
                        // Unhandled API exception, we can't be sure that format printer is alive
-                       self::header( 'MediaWiki-API-Error: internal_api_error_' . get_class( $this ) );
+                       self::header( 'MediaWiki-API-Error: internal_api_error_' . static::class );
                        wfHttpError( 500, 'Internal Server Error', $this->getText() );
                } elseif ( self::isCommandLine() ) {
                        $message = $this->getText();
index bef379e..749be3c 100644 (file)
@@ -20,6 +20,7 @@
 
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use Psr\Log\LogLevel;
 
 /**
  * Handler class for MWExceptions
@@ -174,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.
@@ -335,7 +342,7 @@ TXT;
                                $text .= "{$pad}#{$level} {$frame['file']}({$frame['line']}): ";
                        } else {
                                // 'file' and 'line' are unset for calls via call_user_func
-                               // (bug 55634) This matches behaviour of
+                               // (T57634) This matches behaviour of
                                // Exception::getTraceAsString to instead display "[internal
                                // function]".
                                $text .= "{$pad}#{$level} [internal function]: ";
@@ -621,8 +628,11 @@ 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
@@ -630,7 +640,8 @@ TXT;
                $suppressed = ( error_reporting() & $e->getSeverity() ) === 0;
                if ( !$suppressed ) {
                        $logger = LoggerFactory::getInstance( $channel );
-                       $logger->error(
+                       $logger->log(
+                               $level,
                                self::getLogMessage( $e ),
                                self::getLogContext( $e, $catcher )
                        );
@@ -640,7 +651,7 @@ TXT;
                $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 3524d09..df7111a 100644 (file)
@@ -23,4 +23,3 @@ class MWUnknownContentModelException extends MWException {
                return $this->modelId;
        }
 }
-
index 5ecd237..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 ) ];
index 43c5b09..6086d55 100644 (file)
@@ -32,7 +32,7 @@
  * @par Example:
  * @code
  * if( $user->isAnon() ) {
- *     throw new UserNotLoggedIn();
+ *   throw new UserNotLoggedIn();
  * }
  * @endcode
  *
  * @par Example:
  * @code
  * if( $user->isAnon() ) {
- *     throw new UserNotLoggedIn( 'action-require-loggedin' );
+ *   throw new UserNotLoggedIn( 'action-require-loggedin' );
  * }
  * @endcode
  *
- * @see bug 37627
+ * @see T39627
  * @since 1.20
  * @ingroup Exception
  */
index c1f2d59..e41ab54 100644 (file)
@@ -27,6 +27,8 @@
  * @defgroup Dump Dump
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * @ingroup SpecialPage Dump
  */
@@ -343,7 +345,7 @@ class WikiExporter {
                                # query optimization for history stub dumps
                                if ( $this->text == WikiExporter::STUB && $orderRevs ) {
                                        $tables = [ 'revision', 'page' ];
-                                       $opts[] = 'STRAIGHT_JOIN';
+                                       $opts[] = 'STRAIGHT_JOIN';
                                        $opts['ORDER BY'] = [ 'rev_page ASC', 'rev_id ASC' ];
                                        $opts['USE INDEX']['revision'] = 'rev_page_id';
                                        $join['page'] = [ 'INNER JOIN', 'rev_page=page_id' ];
index 5be166b..5a1f92c 100644 (file)
@@ -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";
 
@@ -431,6 +433,9 @@ class XmlDumpWriter {
                global $wgContLang;
                $prefix = $wgContLang->getFormattedNsText( $title->getNamespace() );
 
+               // @todo Emit some kind of warning to the user if $title->getNamespace() !==
+               // NS_MAIN and $prefix === '' (viz. pages in an unregistered namespace)
+
                if ( $prefix !== '' ) {
                        $prefix .= ':';
                }
index 52c1a4c..d907c30 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\LoadBalancer;
+
 /**
  * DB accessable external objects.
  *
@@ -106,9 +108,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * @return LoadBalancer
         */
        private function getLoadBalancer( $cluster ) {
-               $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
-
-               return wfGetLBFactory()->getExternalLB( $cluster, $wiki );
+               return wfGetLBFactory()->getExternalLB( $cluster );
        }
 
        /**
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 );
                }
index 0e4b2f0..8edf81f 100644 (file)
@@ -1448,7 +1448,7 @@ class FileRepo {
                                'dst' => $archivePath,
                                // We may have 2+ identical files being deleted,
                                // all of which will map to the same destination file
-                               'overwriteSame' => true // also see bug 31792
+                               'overwriteSame' => true // also see T33792
                        ];
                }
 
index ca41718..43f1d21 100644 (file)
@@ -571,7 +571,7 @@ class ForeignAPIRepo extends FileRepo {
 
                $cache = ObjectCache::getMainWANInstance();
                return $cache->getWithSetCallback(
-                       $this->getLocalCacheKey( get_class( $this ), $target, md5( $url ) ),
+                       $this->getLocalCacheKey( static::class, $target, md5( $url ) ),
                        $cacheTTL,
                        function ( $curValue, &$ttl ) use ( $url, $cache ) {
                                $html = self::httpGet( $url, 'default', [], $mtime );
@@ -593,13 +593,13 @@ class ForeignAPIRepo extends FileRepo {
         * @throws MWException
         */
        function enumFiles( $callback ) {
-               throw new MWException( 'enumFiles is not supported by ' . get_class( $this ) );
+               throw new MWException( 'enumFiles is not supported by ' . static::class );
        }
 
        /**
         * @throws MWException
         */
        protected function assertWritableRepo() {
-               throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+               throw new MWException( static::class . ': write operations are not supported.' );
        }
 }
index f49ef88..3e88508 100644 (file)
@@ -138,7 +138,7 @@ class ForeignDBRepo extends LocalRepo {
        }
 
        protected function assertWritableRepo() {
-               throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+               throw new MWException( static::class . ': write operations are not supported.' );
        }
 
        /**
index a9cd030..f83fd1c 100644 (file)
@@ -100,7 +100,7 @@ class ForeignDBViaLBRepo extends LocalRepo {
        }
 
        protected function assertWritableRepo() {
-               throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+               throw new MWException( static::class . ': write operations are not supported.' );
        }
 
        public function getInfo() {
index d49ae7b..d5e29ab 100644 (file)
@@ -22,6 +22,8 @@
  * @ingroup FileRepo
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A repository that stores files in the local filesystem and registers them
  * in the wiki's own database. This is the most commonly used repository class.
index f2b7395..1c12e02 100644 (file)
@@ -33,6 +33,6 @@ class NullRepo extends FileRepo {
        }
 
        protected function assertWritableRepo() {
-               throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+               throw new MWException( static::class . ': write operations are not supported.' );
        }
 }
index 9a7a55b..6984d48 100644 (file)
@@ -492,22 +492,6 @@ 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|int
-        */
-       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.
         *
index be78462..f7e85a8 100644 (file)
@@ -919,7 +919,7 @@ abstract class File implements IDBAccessObject {
                        return $this->iconThumb();
                }
                $hp['width'] = $width;
-               // be sure to ignore any height specification as well (bug 62258)
+               // be sure to ignore any height specification as well (T64258)
                unset( $hp['height'] );
 
                return $this->transform( $hp );
@@ -1039,7 +1039,7 @@ abstract class File implements IDBAccessObject {
                                break; // not a bitmap or renderable image, don't try
                        }
 
-                       // Get the descriptionUrl to embed it as comment into the thumbnail. Bug 19791.
+                       // Get the descriptionUrl to embed it as comment into the thumbnail. T21791.
                        $descriptionUrl = $this->getDescriptionUrl();
                        if ( $descriptionUrl ) {
                                $params['descriptionUrl'] = wfExpandUrl( $descriptionUrl, PROTO_CANONICAL );
@@ -1766,7 +1766,7 @@ abstract class File implements IDBAccessObject {
         * @throws MWException
         */
        function readOnlyError() {
-               throw new MWException( get_class( $this ) . ': write operations are not supported' );
+               throw new MWException( static::class . ': write operations are not supported' );
        }
 
        /**
index c6c49b4..f6f44e6 100644 (file)
@@ -120,10 +120,10 @@ class ForeignDBFile extends LocalFile {
        }
 
        /**
-        * @param bool|Language $lang Optional language to fetch description in.
+        * @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 16fe72d..a633fd2 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
         */
@@ -382,7 +391,7 @@ class LocalFile extends File {
         * @param int $flags
         */
        function loadFromDB( $flags = 0 ) {
-               $fname = get_class( $this ) . '::' . __FUNCTION__;
+               $fname = static::class . '::' . __FUNCTION__;
 
                # Unconditionally set loaded=true, we don't want the accessors constantly rechecking
                $this->dataLoaded = true;
@@ -407,7 +416,7 @@ class LocalFile extends File {
         * This covers fields that are sometimes not cached.
         */
        protected function loadExtraFromDB() {
-               $fname = get_class( $this ) . '::' . __FUNCTION__;
+               $fname = static::class . '::' . __FUNCTION__;
 
                # Unconditionally set loaded=true, we don't want the accessors constantly rechecking
                $this->extraDataLoaded = true;
@@ -882,7 +891,7 @@ class LocalFile extends File {
                                $files[] = $file;
                        }
                } catch ( FileBackendError $e ) {
-               } // suppress (bug 54674)
+               } // suppress (T56674)
 
                return $files;
        }
@@ -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 );
@@ -1089,7 +1100,7 @@ class LocalFile extends File {
         */
        public function nextHistoryLine() {
                # Polymorphic function name to distinguish foreign and local fetches
-               $fname = get_class( $this ) . '::' . __FUNCTION__;
+               $fname = static::class . '::' . __FUNCTION__;
 
                $dbr = $this->repo->getReplicaDB();
 
@@ -1342,7 +1353,7 @@ class LocalFile extends File {
                                }
                        }
 
-                       # (bug 34993) Note: $oldver can be empty here, if the previous
+                       # (T36993) Note: $oldver can be empty here, if the previous
                        # version of the file was broken. Allow registration of the new
                        # version to continue anyway, because that's better than having
                        # an image that's not fixable by user operations.
@@ -1996,7 +2007,7 @@ class LocalFile extends File {
                        $dbw = $this->repo->getMasterDB();
                        $makesTransaction = !$dbw->trxLevel();
                        $dbw->startAtomic( self::ATOMIC_SECTION_LOCK );
-                       // Bug 54736: use simple lock to handle when the file does not exist.
+                       // T56736: use simple lock to handle when the file does not exist.
                        // SELECT FOR UPDATE prevents changes, not other SELECTs with FOR UPDATE.
                        // Also, that would cause contention on INSERT of similarly named rows.
                        $status = $this->acquireFileLock(); // represents all versions of the file
@@ -3024,7 +3035,7 @@ class LocalFileMoveBatch {
                        $status->failCount++;
                }
                $status->successCount += $oldRowCount;
-               // Bug 34934: oldCount is based on files that actually exist.
+               // T36934: oldCount is based on files that actually exist.
                // There may be more DB rows than such files, in which case $affected
                // can be greater than $total. We use max() to avoid negatives here.
                $status->failCount += max( 0, $this->oldCount - $oldRowCount );
index 5c5a9a7..399147b 100644 (file)
@@ -165,6 +165,7 @@ class HTMLForm extends ContextSource {
                'url' => 'HTMLTextField',
                'title' => 'HTMLTitleTextField',
                'user' => 'HTMLUserTextField',
+               'usersmultiselect' => 'HTMLUsersMultiselectField',
        ];
 
        public $mFieldData;
@@ -1061,6 +1062,9 @@ class HTMLForm extends ContextSource {
                if ( $this->mName ) {
                        $attribs['name'] = $this->mName;
                }
+               if ( $this->needsJSForHtml5FormValidation() ) {
+                       $attribs['novalidate'] = true;
+               }
                return $attribs;
        }
 
@@ -1255,7 +1259,7 @@ class HTMLForm extends ContextSource {
         *
         * @param string|array|Status $elements The set of errors/warnings to process.
         * @param string $elementsType Should warnings or errors be returned.  This is meant
-        *      for Status objects, all other valid types are always considered as errors.
+        *     for Status objects, all other valid types are always considered as errors.
         * @return string
         */
        public function getErrorsOrWarnings( $elements, $elementsType ) {
@@ -1876,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 804bbff..3a3146b 100644 (file)
@@ -475,7 +475,7 @@ abstract class HTMLFormField {
        public function getTableRow( $value ) {
                list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
                $inputHtml = $this->getInputHTML( $value );
-               $fieldType = get_class( $this );
+               $fieldType = static::class;
                $helptext = $this->getHelpTextHtmlTable( $this->getHelpText() );
                $cellAttributes = [];
                $rowAttributes = [];
@@ -533,7 +533,7 @@ abstract class HTMLFormField {
        public function getDiv( $value ) {
                list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
                $inputHtml = $this->getInputHTML( $value );
-               $fieldType = get_class( $this );
+               $fieldType = static::class;
                $helptext = $this->getHelpTextHtmlDiv( $this->getHelpText() );
                $cellAttributes = [];
                $label = $this->getLabelHtml( $cellAttributes );
@@ -601,7 +601,7 @@ abstract class HTMLFormField {
                        $infusable = false;
                }
 
-               $fieldType = get_class( $this );
+               $fieldType = static::class;
                $help = $this->getHelpText();
                $errors = $this->getErrorsRaw( $value );
                foreach ( $errors as &$error ) {
@@ -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 46172a5..fa18a3c 100644 (file)
@@ -189,7 +189,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
        public function getTableRow( $value ) {
                list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
                $inputHtml = $this->getInputHTML( $value );
-               $fieldType = get_class( $this );
+               $fieldType = static::class;
                $helptext = $this->getHelpTextHtmlTable( $this->getHelpText() );
                $cellAttributes = [ 'colspan' => 2 ];
 
index b43080c..7b59a1d 100644 (file)
@@ -52,22 +52,16 @@ class HTMLDateTimeField extends HTMLTextField {
                        $min = $this->parseDate( $this->mParams['min'] );
                        if ( $min ) {
                                $ret['min'] = $this->formatDate( $min );
-                               // Because Html::expandAttributes filters it out
-                               $ret['data-min'] = $ret['min'];
                        }
                }
                if ( in_array( 'max', $list ) && isset( $this->mParams['max'] ) ) {
                        $max = $this->parseDate( $this->mParams['max'] );
                        if ( $max ) {
                                $ret['max'] = $this->formatDate( $max );
-                               // Because Html::expandAttributes filters it out
-                               $ret['data-max'] = $ret['max'];
                        }
                }
 
                $ret['step'] = 1;
-               // Because Html::expandAttributes filters it out
-               $ret['data-step'] = 1;
 
                $ret['type'] = $this->mType;
                $ret['pattern'] = static::$patterns[$this->mType];
index 8fb840a..dd9184b 100644 (file)
@@ -46,7 +46,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
        protected $uniqueId;
 
        public function __construct( $params ) {
-               $this->uniqueId = get_class( $this ) . ++self::$counter . 'x';
+               $this->uniqueId = static::class . ++self::$counter . 'x';
                parent::__construct( $params );
 
                if ( empty( $this->mParams['fields'] ) || !is_array( $this->mParams['fields'] ) ) {
index 23044bd..2b6e066 100644 (file)
@@ -17,6 +17,11 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        public function __construct( $params ) {
                parent::__construct( $params );
 
+               // If the disabled-options parameter is not provided, use an empty array
+               if ( isset( $this->mParams['disabled-options'] ) === false ) {
+                       $this->mParams['disabled-options'] = [];
+               }
+
                // For backwards compatibility, also handle the old way with 'cssclass' => 'mw-chosen'
                if ( isset( $params['dropdown'] ) || strpos( $this->mClass, 'mw-chosen' ) !== false ) {
                        $this->mClass .= ' mw-htmlform-dropdown';
@@ -75,6 +80,9 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                                        'id' => "{$this->mID}-$info",
                                        'value' => $info,
                                ];
+                               if ( in_array( $info, $this->mParams['disabled-options'], true ) ) {
+                                       $thisAttribs['disabled'] = 'disabled';
+                               }
                                $checked = in_array( $info, $value, true );
 
                                $checkbox = $this->getOneCheckbox( $checked, $attribs + $thisAttribs, $label );
@@ -112,6 +120,18 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                }
        }
 
+       /**
+        * Get options and make them into arrays suitable for OOUI.
+        * @return array Options for inclusion in a select or whatever.
+        */
+       public function getOptionsOOUI() {
+               $options = parent::getOptionsOOUI();
+               foreach ( $options as &$option ) {
+                       $option['disabled'] = in_array( $option['data'], $this->mParams['disabled-options'], true );
+               }
+               return $options;
+       }
+
        /**
         * Get the OOUI version of this field.
         *
index c3da746..b0b66ca 100644 (file)
@@ -187,6 +187,7 @@ class HTMLTextField extends HTMLFormField {
                        'name' => $this->mName,
                        'value' => $value,
                        'type' => $type,
+                       'dir' => $this->mDir,
                ] + $attribs );
        }
 
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 779d606..fa2d5a3 100644 (file)
@@ -46,8 +46,8 @@ class Http {
         *    - caInfo              Provide CA information
         *    - maxRedirects        Maximum number of redirects to follow (defaults to 5)
         *    - followRedirects     Whether to follow redirects (defaults to false).
-        *                                  Note: this should only be used when the target URL is trusted,
-        *                                  to avoid attacks on intranet services accessible by HTTP.
+        *                          Note: this should only be used when the target URL is trusted,
+        *                          to avoid attacks on intranet services accessible by HTTP.
         *    - userAgent           A user agent, if you want to override the default
         *                          MediaWiki/$wgVersion
         *    - logger              A \Psr\Logger\LoggerInterface instance for debug logging
index fac052f..e04402f 100644 (file)
@@ -132,7 +132,7 @@ class MWHttpRequest implements LoggerAwareInterface {
                foreach ( $members as $o ) {
                        if ( isset( $options[$o] ) ) {
                                // ensure that MWHttpRequest::method is always
-                               // uppercased. Bug 36137
+                               // uppercased. T38137
                                if ( $o == 'method' ) {
                                        $options[$o] = strtoupper( $options[$o] );
                                }
@@ -580,7 +580,7 @@ class MWHttpRequest implements LoggerAwareInterface {
         *
         * Note that the multiple Location: headers are an artifact of
         * CURL -- they shouldn't actually get returned this way. Rewrite
-        * this when bug 29232 is taken care of (high-level redirect
+        * this when T31232 is taken care of (high-level redirect
         * handling rewrite).
         *
         * @return string
index 0c12ebb..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)
@@ -148,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 1769924..06b579a 100644 (file)
@@ -546,7 +546,7 @@ class WikiImporter {
        public function doImport() {
                // Calls to reader->read need to be wrapped in calls to
                // libxml_disable_entity_loader() to avoid local file
-               // inclusion attacks (bug 46932).
+               // inclusion attacks (T48932).
                $oldDisable = libxml_disable_entity_loader( true );
                $this->reader->read();
 
index 50d73de..0305535 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Deployment
  */
+use Wikimedia\Rdbms\LBFactorySingle;
 
 /**
  * Base class for DBMS-specific installation helper classes.
index 6a8a99f..f8ab1f2 100644 (file)
@@ -59,6 +59,11 @@ abstract class DatabaseUpdater {
         */
        protected $db;
 
+       /**
+        * @var Maintenance
+        */
+       protected $maintenance;
+
        protected $shared = false;
 
        /**
@@ -485,7 +490,7 @@ abstract class DatabaseUpdater {
        public function updateRowExists( $key ) {
                $row = $this->db->selectRow(
                        'updatelog',
-                       # Bug 65813
+                       # T67813
                        '1 AS X',
                        [ 'ul_key' => $key ],
                        __METHOD__
index 9dc8032..f03fe6a 100644 (file)
@@ -216,7 +216,7 @@ abstract class Installer {
                '_UpgradeKeySupplied' => false,
                '_ExistingDBSettings' => false,
 
-               // $wgLogo is probably wrong (bug 48084); set something that will work.
+               // $wgLogo is probably wrong (T50084); set something that will work.
                // Single quotes work fine here, as LocalSettingsGenerator outputs this unescaped.
                'wgLogo' => '$wgResourceBasePath/resources/assets/wiki.png',
                'wgAuthenticationTokenVersion' => 1,
@@ -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'] ) ) {
@@ -1430,7 +1431,7 @@ abstract class Installer {
                        );
                }
                // Unset everyone else's hooks. Lord knows what someone might be doing
-               // in ParserFirstCallInit (see bug 27171)
+               // in ParserFirstCallInit (see T29171)
                $GLOBALS['wgHooks'] = [ 'LoadExtensionSchemaUpdates' => $hooksWeWant ];
 
                return Status::newGood();
@@ -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 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 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 d95222c..3131c3c 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.
@@ -294,6 +297,8 @@ class MysqlUpdater extends DatabaseUpdater {
 
                        // 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' ],
                ];
        }
 
@@ -819,7 +824,7 @@ class MysqlUpdater extends DatabaseUpdater {
        /**
         * Set page_random field to a random value where it is equals to 0.
         *
-        * @see bug 3946
+        * @see T5946
         */
        protected function doPageRandomUpdate() {
                $page = $this->db->tableName( 'page' );
@@ -851,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 1f0e411..79ae175 100644 (file)
@@ -121,6 +121,7 @@ class OracleUpdater extends DatabaseUpdater {
 
                        // 1.29
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
+                       [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ],
 
                        // 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 1eb3f41..1a7b208 100644 (file)
@@ -448,6 +448,8 @@ class PostgresUpdater extends DatabaseUpdater {
                        [ '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 )' ],
                ];
        }
 
@@ -494,8 +496,8 @@ class PostgresUpdater extends DatabaseUpdater {
                $q = <<<END
 SELECT attname, attnum FROM pg_namespace, pg_class, pg_attribute
        WHERE pg_class.relnamespace = pg_namespace.oid
-         AND attrelid=pg_class.oid AND attnum > 0
-         AND relname=%s AND nspname=%s
+               AND attrelid=pg_class.oid AND attnum > 0
+               AND relname=%s AND nspname=%s
 END;
                $res = $this->db->query( sprintf( $q,
                        $this->db->addQuotes( $table ),
@@ -521,9 +523,9 @@ END;
                $q = <<<END
 SELECT indkey, indrelid FROM pg_namespace, pg_class, pg_index
        WHERE nspname=%s
-         AND pg_class.relnamespace = pg_namespace.oid
-         AND relname=%s
-         AND indexrelid=pg_class.oid
+               AND pg_class.relnamespace = pg_namespace.oid
+               AND relname=%s
+               AND indexrelid=pg_class.oid
 END;
                $res = $this->db->query(
                        sprintf(
@@ -549,8 +551,8 @@ END;
                        $query = <<<END
 SELECT attname FROM pg_class, pg_attribute
        WHERE attrelid=$relid
-         AND attnum=%d
-         AND attrelid=pg_class.oid
+               AND attnum=%d
+               AND attrelid=pg_class.oid
 END;
                        $r2 = $this->db->query( sprintf( $query, $rid ) );
                        if ( !$r2 ) {
@@ -570,8 +572,8 @@ END;
                $q = <<<END
 SELECT confdeltype FROM pg_constraint, pg_namespace
        WHERE connamespace=pg_namespace.oid
-         AND nspname=%s
-         AND conname=%s;
+               AND nspname=%s
+               AND conname=%s;
 END;
                $r = $this->db->query(
                        sprintf(
@@ -592,8 +594,8 @@ END;
                $q = <<<END
 SELECT definition FROM pg_rules
        WHERE schemaname = %s
-         AND tablename = %s
-         AND rulename = %s
+               AND tablename = %s
+               AND rulename = %s
 END;
                $r = $this->db->query(
                        sprintf(
@@ -979,10 +981,10 @@ END;
 
        protected function rebuildTextSearch() {
                if ( $this->updateRowExists( 'patch-textsearch_bug66650.sql' ) ) {
-                       $this->output( "...bug 66650 already fixed or not applicable.\n" );
+                       $this->output( "...T68650 already fixed or not applicable.\n" );
                        return;
                };
                $this->applyPatch( 'patch-textsearch_bug66650.sql', false,
-                       'Rebuilding text search for bug 66650' );
+                       'Rebuilding text search for T68650' );
        }
 }
index c5c4a7c..0fe7068 100644 (file)
@@ -244,9 +244,9 @@ class SqliteInstaller extends DatabaseInstaller {
                        $sql =
 <<<EOT
        CREATE TABLE IF NOT EXISTS objectcache (
-         keyname BLOB NOT NULL default '' PRIMARY KEY,
-         value BLOB,
-         exptime TEXT
+               keyname BLOB NOT NULL default '' PRIMARY KEY,
+               value BLOB,
+               exptime TEXT
        )
 EOT;
                        $conn->query( $sql );
index 32068e6..cdbbfd0 100644 (file)
@@ -161,6 +161,7 @@ class SqliteUpdater extends DatabaseUpdater {
 
                        // 1.29
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
+                       [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ],
                ];
        }
 
index c08212e..c94f0bf 100644 (file)
@@ -1083,7 +1083,7 @@ class WebInstaller extends Installer {
 
                foreach ( $varNames as $name ) {
                        $value = $this->request->getVal( $prefix . $name );
-                       // bug 30524, do not trim passwords
+                       // T32524, do not trim passwords
                        if ( stripos( $name, 'password' ) === false ) {
                                $value = trim( $value );
                        }
index e6deed5..81a107d 100644 (file)
@@ -251,7 +251,7 @@ class WebInstallerName extends WebInstallerPage {
                        $retVal = false;
                }
                // If they asked to subscribe to mediawiki-announce but didn't give
-               // an e-mail, show an error. Bug 29332
+               // an e-mail, show an error. T31332
                if ( !$email && $this->getVar( '_Subscribe' ) ) {
                        $this->parent->showError( 'config-subscribe-noemail' );
                        $retVal = false;
index 62fe785..e4eb255 100644 (file)
@@ -299,9 +299,9 @@ class WebInstallerOutput {
 
 <div id="mw-panel">
        <div class="portal" id="p-logo">
-         <a style="background-image: url(images/installer-logo.png);"
-               href="https://www.mediawiki.org/"
-               title="Main Page"></a>
+               <a style="background-image: url(images/installer-logo.png);"
+                       href="https://www.mediawiki.org/"
+                       title="Main Page"></a>
        </div>
 <?php
        $message = wfMessage( 'config-sidebar' )->plain();
index 2ab0554..3aad6f8 100644 (file)
@@ -92,7 +92,7 @@ abstract class WebInstallerPage {
                }
 
                if ( $continue ) {
-                       // Fake submit button for enter keypress (bug 26267)
+                       // Fake submit button for enter keypress (T28267)
                        // Messages: config-continue, config-restart, config-regenerate
                        $s .= Xml::submitButton(
                                wfMessage( "config-$continue" )->text(),
@@ -133,7 +133,7 @@ abstract class WebInstallerPage {
         * @return string
         */
        public function getName() {
-               return str_replace( 'WebInstaller', '', get_class( $this ) );
+               return str_replace( 'WebInstaller', '', static::class );
        }
 
        /**
index 72973e7..bf732a4 100644 (file)
@@ -67,7 +67,7 @@ class WebInstallerUpgrade extends WebInstallerPage {
 
                        if ( $result ) {
                                // If they're going to possibly regenerate LocalSettings, we
-                               // need to create the upgrade/secret keys. Bug 26481
+                               // need to create the upgrade/secret keys. T28481
                                if ( !$this->getVar( '_ExistingDBSettings' ) ) {
                                        $this->parent->generateKeys();
                                }
index 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 4a1ed65..b950420 100644 (file)
@@ -65,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>.",
@@ -84,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-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>.",
index f9a8da8..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>",
index 1211929..779ad6d 100644 (file)
        "config-admin-error-user": "Fazi diabarzh en ur grouiñ ur merer gant an anv \"<nowiki>$1</nowiki>\".",
        "config-admin-error-password": "Fazi diabarzh o lakaat ur ger-tremen evit ar merour « <nowiki>$1</nowiki> » : <pre>$2</pre>",
        "config-admin-error-bademail": "Ebarzhet hoc'h eus ur chomlec'h postel direizh.",
-       "config-subscribe": "Koumanantit da [https://lists.wikimedia.org/mailman/listinfo/mediawiki-listenn kemennadoù evit ar stummoù nevez].",
+       "config-subscribe": "Koumanantit d'ar [https://lists.wikimedia.org/mailman/listinfo/mediawiki-roll kemennoù evit ar stummoù nevez].",
        "config-almost-done": "Kazi echu eo !\nGellout a rit tremen ar c'hefluniadur nevez ha staliañ ar wiki war-eeun.",
        "config-optional-continue": "Sevel muioc'h a goulennoù ouzhin.",
        "config-optional-skip": "Aet on skuizh, staliañ ar wiki hepken.",
        "config-email-user": "Gweredekaat ar posteloù a implijer da implijer",
        "config-email-user-help": "Aotren a ra an holl implijerien da gas posteloù an eil d'egile mard eo bet gweredekaet an arc'hwel ganto en ho penndibaboù.",
        "config-email-usertalk": "Gweredekaat kemennadur pajennoù kaozeal an implijerien",
-       "config-email-usertalk-help": "Talvezout a ra d'an implijerien da resev kemennadennoù ma vez kemmet o fajennoù kaozeal, ma vez gweredekaet en o fenndibaboù.",
+       "config-email-usertalk-help": "Talvezout a ra d'an implijerien da resev kemennoù ma vez kemmet o fajennoù kaozeal, gant ma vo gweredekaet en o fenndibaboù.",
        "config-email-watchlist": "Gweredekaat ar c'hemenn listenn evezhiañ",
-       "config-email-watchlist-help": "Talvezout a ra d'an implijerien da resev kemennadennoù diwar-benn ar pajennoù evezhiet ganto, ma vez gweredekaet en o fenndibaboù.",
+       "config-email-watchlist-help": "Talvezout a ra d'an implijerien da resev kemennoù diwar-benn ar pajennoù evezhiet ganto, gant ma vo gweredekaet en o fenndibaboù.",
        "config-email-auth": "Gweredekaat an dilesadur dre bostel",
        "config-email-sender": "Chomlec'h postel respont :",
        "config-email-sender-help": "Merkit ar chomlec'h postel da vezañ implijet da chomlec'h distreiñ ar posteloù a ya er-maez.\nDi e vo kaset ar posteloù distaolet.\nNiverus eo ar servijerioù postel a c'houlenn da nebeutañ un [http://fr.wikipedia.org/wiki/Nom_de_domaine anv domani] reizh.",
        "config-install-user-missing": "N'eus ket eus an implijer \"$1\"",
        "config-install-user-missing-create": "N'eus ket eus an implijer \"$1\".\nMa fell deoc'h krouiñ anezhañ, klikit war ar voest \"krouiñ ur gont\" amañ dindan.",
        "config-install-tables": "Krouiñ taolennoù",
-       "config-install-tables-exist": "<strong>Kemenn :</strong> An taolennoù MediaWiki zo anezho dija war a seblant.\nN'eo ket bet graet ar grouidigezh.",
+       "config-install-tables-exist": "<strong>Diwallit :</strong> An taolennoù MediaWiki zo anezho dija war a seblant.\nN'int ket bet adkrouet.",
        "config-install-tables-failed": "'''Fazi :''' c'hwitet eo krouidigezh an daolenn gant ar fazi-mañ : $1",
        "config-install-interwiki": "O leuniañ dre ziouer an daolenn etrewiki",
        "config-install-interwiki-list": "Ne c'haller ket kavout ar restr <code>interwiki.list</code>.",
        "config-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 583b80c..3bfa8a6 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Asoxor",
                        "Calak",
-                       "Muhammed taha"
+                       "Muhammed taha",
+                       "Lost Whispers"
                ]
        },
        "config-desc": "دامەزرێنەرەکە بۆ میدیاویکی",
@@ -44,6 +45,8 @@
        "config-admin-password": "تێپەڕوشە:",
        "config-admin-password-confirm": "دووبارە تێپەڕوشە:",
        "config-admin-email": "ناونیشانی ئیمەیل:",
+       "config-admin-email-help": "ناونیشانی ئیمەیڵەکەت لێرەدا دابنێ بۆئەوەی بتوانیت ئیمەیڵت لە بەکارھێنەرانی ترەوە پێ بگات، تێپەڕ وشە ڕێک بخەیتەوە و ئاگادار بکرێیتەوە لەو گۆڕانکاریانەی کە لەو پەڕانەدا دەکرێن کە چاودێرییان دەکەیت. دەتوانیت ئەم بۆشاییە بە بەتاڵی جێبھێڵیت.",
+       "config-admin-error-bademail": "تۆ ناونیشانی ئیمەیڵێکی ھەڵەت داخڵ کردووە.",
        "config-profile-wiki": "ویکیی کراوە",
        "config-profile-no-anon": "دروستکردنی ھەژمارە پێویستە",
        "config-profile-fishbowl": "تەنھا دەستکاریکەری ڕێگەپێدراوە",
index 9f24ec6..2d2f207 100644 (file)
        "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>.",
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 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 95d2ba3..db92652 100644 (file)
        "config-install-subscribe-fail": "Unable to subscribe to mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL is not installed and <code>allow_url_fopen</code> is not available.",
        "config-install-mainpage": "Creating main page with default content",
+       "config-install-mainpage-exists": "Main page already exists, skipping",
        "config-install-extension-tables": "Creating tables for enabled extensions",
        "config-install-mainpage-failed": "Could not insert main page: $1",
        "config-install-done": "<strong>Congratulations!</strong>\nYou have installed MediaWiki.\n\nThe installer has generated a <code>LocalSettings.php</code> file.\nIt contains all your configuration.\n\nYou will need to download it and put it in the base of your wiki installation (the same directory as index.php). The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\n<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can <strong>[$2 enter your wiki]</strong>.",
index 6b7372c..8c4914c 100644 (file)
@@ -32,7 +32,8 @@
                        "Indiralena",
                        "Peter Bowman",
                        "Dgstranz",
-                       "Irus"
+                       "Irus",
+                       "Tinss"
                ]
        },
        "config-desc": "El instalador de MediaWiki",
        "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/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]"
+       "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 5275548..411b2d0 100644 (file)
        "config-install-subscribe-fail": "قادر تصدیق اعلام مدیاویکی نیست:$1",
        "config-install-subscribe-notpossible": "سی‌یوآر‌ال نصب نشده‌است و <code>allow_url_fopen</code> در دسترس نیست.",
        "config-install-mainpage": "ایجاد صفحهٔ اصلی با محتوای پیش‌فرض",
+       "config-install-mainpage-exists": "صفحهٔ اصلی موجود است، رها شد",
        "config-install-extension-tables": "ایجاد جداول برای افزونه‌های فعال",
        "config-install-mainpage-failed": "قادر به درج صفحهٔ اصلی نمی‌باشد:$1",
        "config-install-done": "'''تبریک!'''\nبا موفقیت مدیاویکی را نصب کردید.\nبرنامه نصب‌کننده پرونده <code>LocalSettings.php</code> را درست کرد.\nکه شامل تمام تنظیمات می‌باشد.\n\nشما نیاز به دریافت آن دارید و آن را در پایهٔ نصب ویکی قرار دهید (همان پوشهٔ index.php). دریافت باید به صورت خودکار شروع شده‌باشد.\n\nاگر دریافت شروع نشد یا اگر آن را لغو کردید با کلیک روی پیوند زیر می‌توانید آن را دریافت کنید:\n\n$3\n\n'''توجه داشته باشید:''' اگر این را الآن انجام ندهید، این پرونده تولیدشده در صورتی که نصب را بدون دریافت آن تمام کردید بعداً در اختیار شما قرار نخواهد گرفت.\n\nوقتی انجام شد شما می‌توانید '''[$2 وارد ویکی شوید]'''.",
        "config-nofile": "پروندهٔ «$1» یافت نشد. آیا حذف شده‌است؟",
        "config-extension-link": "آیا می‌دانستید که ویکی شما [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions] را پشتیبانی می‌کند؟\nشما می‌توانید [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category]",
        "mainpagetext": "'''مدیاویکی با موفقیت نصب شد.'''",
-       "mainpagedocfooter": "از [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents]\nبرای اطلاعات بیشتر در مورد به‌کارگیری نرم‌افزار ویکی استفاده کنید.\n\n== آغاز به کار ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings فهرست تنظیمات پیکربندی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های متداول مدیاویکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ایمیلی نسخه‌های مدیاویکی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources محلی‌سازی مدیاویکی به زبان شما]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam یادگیری روش‌های مقابله با هرزنگاری در ویکی]"
+       "mainpagedocfooter": "از [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents راهنمای کاربری]\nبرای اطلاعات بیشتر در مورد به‌کارگیری نرم‌افزار ویکی استفاده کنید.\n\n== آغاز به کار ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings فهرست تنظیمات پیکربندی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های متداول مدیاویکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ایمیلی نسخه‌های مدیاویکی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources محلی‌سازی مدیاویکی به زبان شما]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam یادگیری روش‌های مقابله با هرزنگاری در ویکی]"
 }
index 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 6257691..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 du contenu] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Apprendre comment lutter contre le pourriel dans votre wiki]"
+       "mainpagedocfooter": "Consultez le [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guide de l’utilisateur du contenu] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Apprendre comment lutter contre le pourriel dans votre wiki]"
 }
index ab1fd7d..d4ac7e3 100644 (file)
        "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 e98988c..161c5db 100644 (file)
@@ -9,7 +9,8 @@
                        "Yona b",
                        "Rotemliss",
                        "Macofe",
-                       "Guycn2"
+                       "Guycn2",
+                       "שמזן"
                ]
        },
        "config-desc": "תכנית ההתקנה של מדיה־ויקי",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "מדיה־ויקי תומכת במערכות מסדי הנתונים הבאות:\n\n$1\n\nאם אינך רואה את מסד הנתונים שלך ברשימה, יש לעקוב אחר ההוראות המקושרות לעיל כדי להפעיל את התמיכה.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] הוא היעד העיקרי עבור מדיה־ויקי ולו התמיכה הטובה ביותר. מדיה־ויקי עובדת גם עם [{{int:version-db-mariadb-url}} MariaDB] ועם [{{int:version-db-percona-url}} Percona Server], שתואמים ל־MySQL. (ר׳ [http://www.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL. ייתכן שיש בתצורה הזאת באגים מסוימים והיא לא מומלצת לסביבות מבצעיות. (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]).",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL. (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]).",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] הוא מסד נתונים קליל עם תמיכה טובה מאוד. (ר׳ [http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], משתמש ב־PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] הוא מסד נתונים עסקי מסחרי. (ר׳ [http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] הוא מסד נתונים עסקי מסחרי לחלונות. ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])",
        "config-cache-options": "הגדרות למטמון עצמים (object caching):",
        "config-cache-help": "מטמון עצמים משמש לשיפור המהירות של מדיה־ויקי על־ידי שמירה של נתונים שהשימוש בהם נפוץ במטמון.\nלאתרים בינוניים וגדולים כדאי מאוד להפעיל את זה, וגם אתרים קטנים ייהנו מזה.",
        "config-cache-none": "ללא מטמון (שום יכולת אינה מוּסרת, אבל הביצועים באתרים גדולים ייפגעו)",
-       "config-cache-accel": "מטמון עצמים (object caching) של PHP&rlm; (APC&rlm;, XCache או WinCache)",
+       "config-cache-accel": "מטמון עצמים (object caching) של PHP&rlm; (APC,&rlm; APCu,&rlm; XCache או WinCache)",
        "config-cache-memcached": "להשתמש ב־Memcached (דורש התקנות והגדרות נוספות)",
        "config-memcached-servers": "שרתי Memcached:",
        "config-memcached-help": "רשימת כתובות IP ש־Memcached ישתמש בהן.\nיש לרשום כתובת אחת בכל שורה ולציין את הפִּתְחָה (port), למשל:\n 127.0.0.1:11211\n 192.168.1.25:1234",
        "config-install-subscribe-fail": "הרישום ל־mediawiki-announce לא הצליח: $1",
        "config-install-subscribe-notpossible": "cURL אינה מותקנת ו־<code>allow_url_fopen</code> אינה זמינה.",
        "config-install-mainpage": "יצירת דף ראשי עם תוכן התחלתי",
+       "config-install-mainpage-exists": "העמוד הראשי כבר קיים, לדלג",
        "config-install-extension-tables": "יצירת טבלאות להרחבות מופעלות",
        "config-install-mainpage-failed": "לא הצליחה הכנסת דף ראשי: $1.",
        "config-install-done": "<strong>מזל טוב!</strong>\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקיית הבסיס שבה הותקן הוויקי שלך (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\n<strong>לתשומת לבך:</strong> אם ההורדה לא תבוצע כעת, קובץ ההגדרות <strong>לא</strong> יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך <strong>[$2 להיכנס לאתר הוויקי שלך]</strong>.",
        "config-nofile": "הקובץ \"$1\" לא נמצא. האם הוא נמחק?",
        "config-extension-link": "הידעת שמדיה־ויקי תומכת ב־[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions הרחבות]?\n\nבאפשרותך לעיין ב־[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category הרחבות לפי קטגוריה].",
        "mainpagetext": "<strong>תוכנת מדיה־ויקי הותקנה בהצלחה.</strong>",
-       "mainpagedocfooter": "היעזרו ב[https://meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam איך להיאבק נגד ספאם באתר הוויקי שלך]"
+       "mainpagedocfooter": "היעזרו ב[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam איך להיאבק נגד ספאם באתר הוויקי שלך]"
 }
index e05b700..98af267 100644 (file)
@@ -5,7 +5,8 @@
                        "Vivek Rai",
                        "Phoenix303",
                        "संजीव कुमार",
-                       "Sahilrathod"
+                       "Sahilrathod",
+                       "Shyamal"
                ]
        },
        "config-desc": "साँचा लिए इंस्टॉलर",
@@ -16,7 +17,9 @@
        "config-localsettings-key": "नवीनीकरण कुंजी",
        "config-localsettings-badkey": "आपकी दी गई कुंजी ग़लत है।",
        "config-your-language": "आपकी भाषा:",
+       "config-your-language-help": "स्थापन के लिए भाषा चुनें",
        "config-wiki-language": "विकी भाषा:",
+       "config-wiki-language-help": "भाषा चुनें जिस  में अधिकतर लेख लिखा जाएगा",
        "config-back": "← वापस",
        "config-continue": "आगे बढ़ें →",
        "config-page-language": "भाषा",
index ca7336a..1c5c2ee 100644 (file)
@@ -68,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 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 18acff0..f292ab3 100644 (file)
@@ -11,7 +11,8 @@
                        "Hwangjy9",
                        "Macofe",
                        "Mooozi",
-                       "Ykhwong"
+                       "Ykhwong",
+                       "Jerrykim306"
                ]
        },
        "config-desc": "미디어위키를 위한 설치 관리자",
        "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 10de248..7859d7a 100644 (file)
        "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 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 b0b78db..89f8e55 100644 (file)
        "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-logo-help": "Матичното руво на МедијаВики има простор за лого од 135x160 пиксели над страничникот.\n\nМожете да употребите <code>$wgStylePath</code> или <code>$wgScriptPath</code> ако вашето лого е релативно на тие патеки.\n\nАко не сакате да имате лого, тогаш оставете го ова поле празно.",
        "config-instantcommons": "Овозможи Instant Commons",
        "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] е функција која им овозможува на викијата да користат слики, звучни записи и други мултимедијални содржини од [https://commons.wikimedia.org/ Ризницата].\nЗа да може ова да работи, МедијаВики бара пристап до семрежјето.\n\nЗа повеќе информации за оваа функција и напатствија за нејзино поставување на вики (сите други освен Ризницата), коносултирајте го [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos прирачникот].",
-       "config-cc-error": "Изборникот на лиценци од Криејтив комонс не даде резултати.\nВнесете го името на лиценцата рачно.",
+       "config-cc-error": "Изборникот на лиценци од Криејтив комонс не даде лиценца.\nВнесете го името на лиценцата рачно.",
        "config-cc-again": "Одберете повторно...",
        "config-cc-not-chosen": "Одберете ја саканата лиценца од Криејтив комонс и стиснете на „proceed“.",
        "config-advanced-settings": "Напредни нагодувања",
        "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>.",
index 0fc0e9f..a37336e 100644 (file)
@@ -5,5 +5,6 @@
                        "Ninjastrikers"
                ]
        },
+       "config-help": "အကူအညီ",
        "mainpagetext": "<strong>မီဒီယာဝီကီကို အောင်မြင်စွာ သွင်းပြီးပါပြီ။</strong>"
 }
index 46156b9..b7a7289 100644 (file)
        "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 24c3e3b..a499553 100644 (file)
@@ -18,7 +18,8 @@
                        "JaapDeKleine",
                        "Macofe",
                        "Hex",
-                       "Mainframe98"
+                       "Mainframe98",
+                       "Rcdeboer"
                ]
        },
        "config-desc": "Het installatieprogramma voor MediaWiki",
@@ -71,7 +72,7 @@
        "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",
@@ -79,7 +80,7 @@
        "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-profile-no-anon": "Account aanmaken verplicht",
        "config-profile-fishbowl": "Alleen voor geautoriseerde bewerkers",
        "config-profile-private": "Privéwiki",
-       "config-profile-help": "Wiki's werken het beste als ze door zoveel mogelijk gebruikers worden bewerkt.\nIn MediaWiki is het eenvoudig om de recente wijzigingen te controleren en eventuele foutieve of kwaadwillende bewerkingen terug te draaien.\n\nDaarnaast vinden velen MediaWiki goed inzetbaar in vele andere rollen, en soms is het niet handig om helemaal \"op de wikimanier\" te werken.\nDaarom biedt dit installatieprogramma u de volgende keuzes voor de basisinstelling van gebruikersvrijheden:\n\nHet profiel '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.\nEen wiki met '''{{int:config-profile-no-anon}}\" biedt extra verantwoordelijkheid, maar kan afschrikken toevallige gebruikers afschrikken.\n\nHet scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerkt, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.\nIn een '''{{int:config-profile-private}}''' kunnen alleen goedgekeurde gebruikers pagina's bekijken en bewerken.\n\nMeer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights handleiding].",
+       "config-profile-help": "Wiki's werken het beste als ze door zoveel mogelijk gebruikers worden bewerkt.\nIn MediaWiki is het eenvoudig om de recente wijzigingen te controleren en eventuele foutieve of kwaadwillende bewerkingen terug te draaien.\n\nDaarnaast vinden velen MediaWiki goed inzetbaar in vele andere rollen, en soms is het niet handig om helemaal \"op de wikimanier\" te werken.\nDaarom biedt dit installatieprogramma u de volgende keuzes voor de basisinstelling van gebruikersvrijheden:\n\nHet profiel '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.\nEen wiki met '''{{int:config-profile-no-anon}}''' biedt extra verantwoordelijkheid, maar kan toevallige gebruikers afschrikken.\n\nHet scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerken, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.\nIn een '''{{int:config-profile-private}}''' kunnen alleen goedgekeurde gebruikers pagina's bekijken en bewerken.\n\nMeer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights handleiding].",
        "config-license": "Auteursrechten en licentie:",
        "config-license-none": "Geen licentie in de voettekst",
        "config-license-cc-by-sa": "Creative Commons Naamsvermelding-Gelijk delen",
        "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 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>.",
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 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 cc8f993..779a32f 100644 (file)
        "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-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": "'''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-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 7b60ed0..8d10b51 100644 (file)
        "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.",
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 f434356..02f6335 100644 (file)
@@ -5,7 +5,8 @@
                        "Михајло Анђелковић",
                        "Milicevic01",
                        "Aktron",
-                       "Сербијана"
+                       "Сербијана",
+                       "Zoranzoki21"
                ]
        },
        "config-desc": "Инсталација за Медијавики",
@@ -82,8 +83,9 @@
        "config-skins": "Теме",
        "config-install-step-done": "готово",
        "config-install-step-failed": "није успело",
+       "config-install-mainpage-exists": "Главна страна већ постоји, прескакање",
        "config-help": "помоћ",
        "config-help-tooltip": "кликните да проширите",
        "mainpagetext": "<strong>Медијавики је успешно инсталиран.</strong>",
-       "mainpagedocfooter": "Погледајте [https://meta.wikimedia.org/wiki/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Често постављена питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научите како да се борете против спама на Вашој вики]"
+       "mainpagedocfooter": "Погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Често постављена питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научите како да се борете против спама на Вашој вики]"
 }
index 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 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 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 d2d5d3c..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-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>。",
index e7f69d3..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-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-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 0a8ae7f..2f58947 100644 (file)
@@ -346,7 +346,7 @@ class JobQueueDB extends JobQueue {
                                        continue; // try the other direction
                                }
                        } else { // table *may* have >= MAX_OFFSET rows
-                               // Bug 42614: "ORDER BY job_random" with a job_random inequality causes high CPU
+                               // T44614: "ORDER BY job_random" with a job_random inequality causes high CPU
                                // in MySQL if there are many rows for some reason. This uses a small OFFSET
                                // instead of job_random for reducing excess claim retries.
                                $row = $dbw->selectRow( 'job', self::selectFields(), // find a random job
index 25a271c..c2c9d66 100644 (file)
@@ -793,9 +793,9 @@ LUA;
        private function getGlobalKey( $name ) {
                $parts = [ 'global', 'jobqueue', $name ];
                foreach ( $parts as $part ) {
-                   if ( !preg_match( '/[a-zA-Z0-9_-]+/', $part ) ) {
-                       throw new InvalidArgumentException( "Key part characters are out of range." );
-                   }
+                       if ( !preg_match( '/[a-zA-Z0-9_-]+/', $part ) ) {
+                               throw new InvalidArgumentException( "Key part characters are out of range." );
+                       }
                }
 
                return implode( ':', $parts );
index cacccbe..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
index d636dc6..d844795 100644 (file)
@@ -128,7 +128,7 @@ class JobSpecification implements IJobSpecification {
 
                $this->type = $type;
                $this->params = $params;
-               $this->title = $title ?: Title::makeTitle( NS_SPECIAL, 'Badtitle/' . get_class( $this ) );
+               $this->title = $title ?: Title::makeTitle( NS_SPECIAL, 'Badtitle/' . static::class );
                $this->opts = $opts;
        }
 
index 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 3cd3448..74c446f 100644 (file)
@@ -137,7 +137,7 @@ class DoubleRedirectJob extends Job {
                        wfDebug( __METHOD__ . " : skipping, already good\n" );
                }
 
-               // Preserve fragment (bug 14904)
+               // Preserve fragment (T16904)
                $newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
                        $currentDest->getFragment(), $newTitle->getInterwiki() );
 
@@ -199,7 +199,7 @@ class DoubleRedirectJob extends Job {
                        $seenTitles[$titleText] = true;
 
                        if ( $title->isExternal() ) {
-                               // If the target is interwiki, we have to break early (bug 40352).
+                               // If the target is interwiki, we have to break early (T42352).
                                // Otherwise it will look up a row in the local page table
                                // with the namespace/page of the interwiki target which can cause
                                // unexpected results (e.g. X -> foo:Bar -> Bar -> .. )
index 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 37e80c2..e89812b 100644 (file)
@@ -128,7 +128,7 @@ class PublishStashedFileJob extends Job {
                        );
                        $this->setLastError( get_class( $e ) . ": " . $e->getMessage() );
                        // To prevent potential database referential integrity issues.
-                       // See bug 32551.
+                       // See T34551.
                        MWExceptionHandler::rollbackMasterChangesAndLog( $e );
 
                        return false;
index 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..f9284a5 100644 (file)
@@ -29,7 +29,7 @@ use MediaWiki\MediaWikiServices;
  *   - a) Recursive jobs to update links for backlink pages for a given title.
  *        These jobs have (recursive:true,table:<table>) set.
  *   - b) Jobs to update links for a set of pages (the job title is ignored).
- *           These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
+ *        These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
  *   - c) Jobs to update links for a single page (the job title)
  *        These jobs need no extra fields set.
  *
@@ -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 7f50055..1c12a1c 100644 (file)
@@ -33,7 +33,7 @@
  * For example, if templates A and B are edited (at the same time) the queue will have:
  *     (A base, B base)
  * When these jobs run, the queue will have per-title and remnant partition jobs:
- *        (titleX,titleY,titleZ,...,A remnant,titleM,titleN,titleO,...,B remnant)
+ *     (titleX,titleY,titleZ,...,A remnant,titleM,titleN,titleO,...,B remnant)
  *
  * This works best when the queue is FIFO, for several reasons:
  *   - a) Since the remnant jobs are enqueued after the leaf jobs, the slower leaf jobs have to
@@ -133,7 +133,7 @@ class BacklinkJobUtils {
                                        'table'         => $params['table'],
                                        'range'         => [
                                                'start'     => $ranges[1][0],
-                                               'end'       => $ranges[count( $ranges ) - 1][1],
+                                               'end'       => $ranges[count( $ranges ) - 1][1],
                                                'batchSize' => $realBSize,
                                                'subranges' => array_slice( $ranges, 1 )
                                        ],
index bc99672..b1cece8 100644 (file)
@@ -8,7 +8,7 @@
  * not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *             http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software distributed
  * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
@@ -237,7 +237,7 @@ class CSSMin {
                //       * Otherwise remap the URL to work in generated stylesheets
 
                // Guard against trailing slashes, because "some/remote/../foo.png"
-               // resolves to "some/remote/foo.png" on (some?) clients (bug 27052).
+               // resolves to "some/remote/foo.png" on (some?) clients (T29052).
                if ( substr( $remote, -1 ) == '/' ) {
                        $remote = substr( $remote, 0, -1 );
                }
index 4c86757..6b3e4a7 100644 (file)
@@ -197,11 +197,11 @@ class CryptHKDF {
         * From http://eprint.iacr.org/2010/264.pdf:
         *
         * The scheme HKDF is specifed as:
-        *      HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
+        *   HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
         * where the values K(i) are defined as follows:
-        *      PRK = HMAC(XTS, SKM)
-        *      K(1) = HMAC(PRK, CTXinfo || 0);
-        *      K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
+        *   PRK = HMAC(XTS, SKM)
+        *   K(1) = HMAC(PRK, CTXinfo || 0);
+        *   K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
         * where t = [L/k] and the value K(t) is truncated to its first d = L mod k bits;
         * the counter i is non-wrapping and of a given fixed size, e.g., a single byte.
         * Note that the length of the HMAC output is the same as its key length and therefore
index 72fc333..27f8728 100644 (file)
@@ -101,6 +101,7 @@ class HttpStatus {
                        return false;
                }
 
+               MediaWiki\HeaderCallback::warnIfHeadersSent();
                if ( $version === null ) {
                        $version = isset( $_SERVER['SERVER_PROTOCOL'] ) &&
                                $_SERVER['SERVER_PROTOCOL'] === 'HTTP/1.0' ?
index 21203a4..a6aa0a3 100644 (file)
@@ -675,7 +675,7 @@ class IP {
         * @return string|null Valid dotted quad IPv4 address or null
         */
        public static function canonicalize( $addr ) {
-               // remove zone info (bug 35738)
+               // remove zone info (T37738)
                $addr = preg_replace( '/\%.*/', '', $addr );
 
                if ( self::isValid( $addr ) ) {
index db085da..e860ec4 100644 (file)
@@ -85,7 +85,7 @@ class StatusValue {
         * defined as:
         * [
         *     0 => object(StatusValue) # the StatusValue with error messages, only
-        *         1 => object(StatusValue) # The StatusValue with warning messages, only
+        *     1 => object(StatusValue) # The StatusValue with warning messages, only
         * ]
         *
         * @return StatusValue[]
@@ -154,7 +154,7 @@ class StatusValue {
        }
 
        /**
-        * Change operation resuklt
+        * Change operation result
         *
         * @param bool $ok Whether the operation completed
         * @param mixed $value
index 26f3c4a..cffb5a3 100644 (file)
@@ -168,6 +168,7 @@ class StringUtils {
        ) {
                $inputPos = 0;
                $outputPos = 0;
+               $contentPos = 0;
                $output = '';
                $foundStart = false;
                $encStart = preg_quote( $startDelim, '!' );
index b0cd413..304f6c1 100644 (file)
@@ -65,4 +65,3 @@ abstract class EventRelayer implements LoggerAwareInterface {
         */
        abstract protected function doNotify( $channel, array $events );
 }
-
index 8afdce4..4f0805b 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup FileBackend
  * @author Aaron Schulz
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * @brief Class for a file system (FS) based file backend.
index 212e84f..53bce33 100644 (file)
@@ -167,7 +167,7 @@ class FileBackendMultiWrite extends FileBackend {
                // Do a consistency check to see if the backends are consistent...
                $syncStatus = $this->consistencyCheck( $relevantPaths );
                if ( !$syncStatus->isOK() ) {
-                       wfDebugLog( 'FileOperation', get_class( $this ) .
+                       wfDebugLog( 'FileOperation', static::class .
                                " failed sync check: " . FormatJson::encode( $relevantPaths ) );
                        // Try to resync the clone backends to the master on the spot...
                        if ( $this->autoResync === false
@@ -378,7 +378,7 @@ class FileBackendMultiWrite extends FileBackend {
                }
 
                if ( !$status->isOK() ) {
-                       wfDebugLog( 'FileOperation', get_class( $this ) .
+                       wfDebugLog( 'FileOperation', static::class .
                                " failed to resync: " . FormatJson::encode( $paths ) );
                }
 
index a7ceab2..7cb26c6 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup FileBackend
  * @author Aaron Schulz
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * @brief Base class for all backends using particular storage medium.
@@ -359,7 +360,7 @@ abstract class FileBackendStore extends FileBackend {
                        $status->merge( $this->doConcatenate( $params ) );
                        $sec = microtime( true ) - $start_time;
                        if ( !$status->isOK() ) {
-                               $this->logger->error( get_class( $this ) . "-{$this->name}" .
+                               $this->logger->error( static::class . "-{$this->name}" .
                                        " failed to concatenate " . count( $params['srcs'] ) . " file(s) [$sec sec]" );
                        }
                }
@@ -1122,7 +1123,7 @@ abstract class FileBackendStore extends FileBackend {
                                $subStatus->success[$i] = false;
                                ++$subStatus->failCount;
                        }
-                       $this->logger->error( get_class( $this ) . "-{$this->name} " .
+                       $this->logger->error( static::class . "-{$this->name} " .
                                " stat failure; aborted operations: " . FormatJson::encode( $ops ) );
                }
 
index 800fdfa..a7d064b 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * Functions related to the output of file content
index d40e896..c50dfd7 100644 (file)
@@ -1089,7 +1089,7 @@ class SwiftFileBackend extends FileBackendStore {
                        // good
                } elseif ( $rcode === 404 ) {
                        $status->fatal( 'backend-fail-stream', $params['src'] );
-                       // Per bug 41113, nasty things can happen if bad cache entries get
+                       // Per T43113, nasty things can happen if bad cache entries get
                        // stuck in cache. It's also possible that this error can come up
                        // with simple race conditions. Clear out the stat cache to be safe.
                        $this->clearCache( [ $params['src'] ] );
index fab5a37..79af194 100644 (file)
@@ -461,7 +461,7 @@ abstract class FileOp {
                $params = $this->params;
                $params['failedAction'] = $action;
                try {
-                       $this->logger->error( get_class( $this ) .
+                       $this->logger->error( static::class .
                                " failed (batch #{$this->batchId}): " . FormatJson::encode( $params ) );
                } catch ( Exception $e ) {
                        // bad config? debug log error?
index 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 b04d3c6..2468f38 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]
@@ -94,9 +95,9 @@ application/vnd.ms-powerpoint [OFFICE]
 application/x-director         [OFFICE]
 text/rtf                       [OFFICE]
 
-application/vnd.openxmlformats-officedocument.wordprocessingml.document        [OFFICE]
+application/vnd.openxmlformats-officedocument.wordprocessingml.document        [OFFICE]
 application/vnd.openxmlformats-officedocument.wordprocessingml.template                [OFFICE]
-application/vnd.ms-word.document.macroEnabled.12                               [OFFICE]
+application/vnd.ms-word.document.macroEnabled.12                               [OFFICE]
 application/vnd.ms-word.template.macroEnabled.12                               [OFFICE]
 application/vnd.openxmlformats-officedocument.presentationml.template          [OFFICE]
 application/vnd.openxmlformats-officedocument.presentationml.slideshow         [OFFICE]
index 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 d0b68bc..77c4259 100644 (file)
@@ -679,7 +679,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
        protected function debug( $text ) {
                if ( $this->debugMode ) {
                        $this->logger->debug( "{class} debug: $text", [
-                               'class' => get_class( $this ),
+                               'class' => static::class,
                        ] );
                }
        }
index ae91be5..730eed1 100644 (file)
@@ -63,9 +63,9 @@ class RESTBagOStuff extends BagOStuff {
        protected function doGet( $key, $flags = 0 ) {
                $req = [
                        'method' => 'GET',
-                   'url' => $this->url . rawurlencode( $key ),
-
+                       'url' => $this->url . rawurlencode( $key ),
                ];
+
                list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->client->run( $req );
                if ( $rcode === 200 ) {
                        if ( is_string( $rbody ) ) {
index d852f82..583ec37 100644 (file)
@@ -321,7 +321,7 @@ class RedisBagOStuff extends BagOStuff {
         */
        protected function serialize( $data ) {
                // Serialize anything but integers so INCR/DECR work
-               // Do not store integer-like strings as integers to avoid type confusion (bug 60563)
+               // Do not store integer-like strings as integers to avoid type confusion (T62563)
                return is_int( $data ) ? $data : serialize( $data );
        }
 
index 8d3c6d9..f0a439a 100644 (file)
@@ -44,15 +44,20 @@ use Psr\Log\NullLogger;
  *
  * The simplest purge method is delete().
  *
- * There are two supported ways to handle broadcasted operations:
+ * There are three supported ways to handle broadcasted operations:
  *   - a) Configure the 'purge' EventRelayer to point to a valid PubSub endpoint
- *        that has subscribed listeners on the cache servers applying the cache updates.
+ *         that has subscribed listeners on the cache servers applying the cache updates.
  *   - b) Ignore the 'purge' EventRelayer configuration (default is NullEventRelayer)
- *        and set up mcrouter as the underlying cache backend, using one of the memcached
- *        BagOStuff classes as 'cache'. Use OperationSelectorRoute in the mcrouter settings
- *        to configure 'set' and 'delete' operations to go to all DCs via AllAsyncRoute and
- *        configure other operations to go to the local DC via PoolRoute (for reference,
- *        see https://github.com/facebook/mcrouter/wiki/List-of-Route-Handles).
+ *         and set up mcrouter as the underlying cache backend, using one of the memcached
+ *         BagOStuff classes as 'cache'. Use OperationSelectorRoute in the mcrouter settings
+ *         to configure 'set' and 'delete' operations to go to all DCs via AllAsyncRoute and
+ *         configure other operations to go to the local DC via PoolRoute (for reference,
+ *         see https://github.com/facebook/mcrouter/wiki/List-of-Route-Handles).
+ *   - c) Ignore the 'purge' EventRelayer configuration (default is NullEventRelayer)
+ *         and set up dynomite as cache middleware between the web servers and either
+ *         memcached or redis. This will also broadcast all key setting operations, not just purges,
+ *         which can be useful for cache warming. Writes are eventually consistent via the
+ *         Dynamo replication model (see https://github.com/Netflix/dynomite).
  *
  * Broadcasted operations like delete() and touchCheckKey() are done asynchronously
  * in all datacenters this way, though the local one should likely be near immediate.
@@ -275,8 +280,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 +453,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 +462,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 +1132,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 +1422,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 d84c959..98f44d1 100644 (file)
@@ -41,7 +41,7 @@ class WinCacheBagOStuff extends BagOStuff {
                $result = wincache_ucache_set( $key, serialize( $value ), $expire );
 
                /* wincache_ucache_set returns an empty array on success if $value
-                  was an array, bool otherwise */
+                * was an array, bool otherwise */
                return ( is_array( $result ) && $result === [] ) || $result;
        }
 
index 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
index 4f72f77..fc00965 100644 (file)
@@ -6,7 +6,6 @@ use Database;
 use DBConnRef;
 use IDatabase;
 use InvalidArgumentException;
-use LoadBalancer;
 
 /**
  * Database connection manager.
index b268b9f..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
index 69cf1ac..e807bc8 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\ResultWrapper;
+use Wikimedia\Rdbms\DBMasterPos;
+use Wikimedia\Rdbms\Blob;
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * Relational database abstraction object
@@ -841,7 +848,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                // Add trace comment to the begin of the sql string, right after the operator.
-               // Or, for one-word queries (like "BEGIN" or COMMIT") add it to the end (bug 42598)
+               // Or, for one-word queries (like "BEGIN" or COMMIT") add it to the end (T44598)
                $commentedSql = preg_replace( '/\s|$/', " /* $fname {$this->agent} */ ", $sql, 1 );
 
                # Start implicit transactions that wrap the request if DBO_TRX is enabled
@@ -1020,8 +1027,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
        private function handleSessionLoss() {
                $this->mTrxLevel = 0;
-               $this->mTrxIdleCallbacks = []; // bug 65263
-               $this->mTrxPreCommitCallbacks = []; // bug 65263
+               $this->mTrxIdleCallbacks = []; // T67263
+               $this->mTrxPreCommitCallbacks = []; // T67263
                $this->mSessionTempTables = [];
                $this->mNamedLocksHeld = [];
                try {
@@ -1136,12 +1143,6 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
                $preLimitTail .= $this->makeOrderBy( $options );
 
-               // if (isset($options['LIMIT'])) {
-               //      $tailOpts .= $this->limitResult('', $options['LIMIT'],
-               //              isset($options['OFFSET']) ? $options['OFFSET']
-               //              : false);
-               // }
-
                if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE';
                }
@@ -2313,7 +2314,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 );
                }
@@ -3411,7 +3412,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         */
        public function __clone() {
                $this->connLogger->warning(
-                       "Cloning " . get_class( $this ) . " is not recomended; forking connection:\n" .
+                       "Cloning " . static::class . " is not recomended; forking connection:\n" .
                        ( new RuntimeException() )->getTraceAsString()
                );
 
@@ -3462,4 +3463,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..75ddc9d
--- /dev/null
@@ -0,0 +1,1362 @@
+<?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;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\MssqlResultWrapper;
+
+/**
+ * @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 5d680e2..9270589 100644 (file)
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\DBMasterPos;
+use Wikimedia\Rdbms\MySQLMasterPos;
+use Wikimedia\Rdbms\MySQLField;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * Database abstraction object for MySQL.
@@ -1331,4 +1335,3 @@ abstract class DatabaseMysqlBase extends Database {
                return in_array( $name, $this->listViews( $prefix ) );
        }
 }
-
index 2f27ff9..7a2200a 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Database
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Database abstraction object for PHP extension mysqli.
  *
index 42113b0..af9716d 100644 (file)
  * @file
  * @ingroup Database
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 use Wikimedia\WaitConditionLoop;
+use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\PostgresBlob;
+use Wikimedia\Rdbms\PostgresField;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * @ingroup Database
@@ -698,7 +703,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 );
                }
@@ -982,7 +987,7 @@ __INDEXATTR__;
                                /**
                                 * Prepend our schema (e.g. 'mediawiki') in front
                                 * of the search path
-                                * Fixes bug 15816
+                                * Fixes T17816
                                 */
                                $search_path = $this->getSearchPath();
                                array_unshift( $search_path,
@@ -1023,7 +1028,7 @@ __INDEXATTR__;
                                // Normal client
                                $this->numericVersion = $versionInfo['server'];
                        } else {
-                               // Bug 16937: broken pgsql extension from PHP<5.3
+                               // T18937: broken pgsql extension from PHP<5.3
                                $this->numericVersion = pg_parameter_status( $conn, 'server_version' );
                        }
                }
@@ -1076,8 +1081,8 @@ __INDEXATTR__;
                $q = <<<SQL
        SELECT 1 FROM pg_class, pg_namespace, pg_trigger
                WHERE relnamespace=pg_namespace.oid AND relkind='r'
-                         AND tgrelid=pg_class.oid
-                         AND nspname=%s AND relname=%s AND tgname=%s
+                       AND tgrelid=pg_class.oid
+                       AND nspname=%s AND relname=%s AND tgname=%s
 SQL;
                $res = $this->query(
                        sprintf(
@@ -1249,15 +1254,9 @@ SQL;
 
                $preLimitTail .= $this->makeOrderBy( $options );
 
-               // if ( isset( $options['LIMIT'] ) ) {
-               //      $tailOpts .= $this->limitResult( '', $options['LIMIT'],
-               //              isset( $options['OFFSET'] ) ? $options['OFFSET']
-               //              : false );
-               // }
-
                if ( isset( $options['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE OF ' .
-                               implode( ', ', array_map( [ &$this, 'tableName' ], $options['FOR UPDATE'] ) );
+                               implode( ', ', array_map( [ $this, 'tableName' ], $options['FOR UPDATE'] ) );
                } elseif ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE';
                }
index a4b2df0..090ce8e 100644 (file)
@@ -21,6 +21,9 @@
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\SQLiteField;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * @ingroup Database
index c6055db..6bc870b 100644 (file)
  * @ingroup Database
  */
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\LikeMatch;
+use Wikimedia\Rdbms\DBMasterPos;
+use Wikimedia\Rdbms\Field;
+use Wikimedia\Rdbms\IResultWrapper;
 
 /**
  * Basic database interface for live and lazy-loaded relation database handles
@@ -359,7 +364,7 @@ interface IDatabase {
         * member variables.
         * If no more rows are available, false is returned.
         *
-        * @param ResultWrapper|stdClass $res Object as returned from IDatabase::query(), etc.
+        * @param IResultWrapper|stdClass $res Object as returned from IDatabase::query(), etc.
         * @return stdClass|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
@@ -370,7 +375,7 @@ interface IDatabase {
         * form. Fields are retrieved with $row['fieldname'].
         * If no more rows are available, false is returned.
         *
-        * @param ResultWrapper $res Result object as returned from IDatabase::query(), etc.
+        * @param IResultWrapper $res Result object as returned from IDatabase::query(), etc.
         * @return array|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
@@ -513,7 +518,7 @@ interface IDatabase {
         * @param bool $tempIgnore Whether to avoid throwing an exception on errors...
         *     maybe best to catch the exception instead?
         * @throws DBError
-        * @return bool|ResultWrapper True for a successful write query, ResultWrapper object
+        * @return bool|IResultWrapper True for a successful write query, IResultWrapper object
         *     for a successful read query, or false on failure if $tempIgnore set
         */
        public function query( $sql, $fname = __METHOD__, $tempIgnore = false );
@@ -727,7 +732,7 @@ interface IDatabase {
         *
         *    [ 'page' => [ 'LEFT JOIN', 'page_latest=rev_id' ] ]
         *
-        * @return ResultWrapper|bool If the query returned no rows, a ResultWrapper
+        * @return IResultWrapper|bool If the query returned no rows, a IResultWrapper
         *   with no rows in it will be returned. If there was a query error, a
         *   DBQueryError exception will be thrown, except if the "ignore errors"
         *   option was set, in which case false will be returned.
@@ -905,6 +910,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 +1155,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
@@ -1188,7 +1197,7 @@ interface IDatabase {
         *   for the format. Use $conds == "*" to delete all rows
         * @param string $fname Name of the calling function
         * @throws DBUnexpectedError
-        * @return bool|ResultWrapper
+        * @return bool|IResultWrapper
         */
        public function delete( $table, $conds, $fname = __METHOD__ );
 
@@ -1216,7 +1225,7 @@ interface IDatabase {
         * @param array $selectOptions Options for the SELECT part of the query, see
         *    IDatabase::select() for details.
         *
-        * @return ResultWrapper
+        * @return IResultWrapper
         */
        public function insertSelect( $destTable, $srcTable, $varMap, $conds,
                $fname = __METHOD__,
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
  *
index 1a046cf..fd7af11 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
+use stdClass;
+
 /**
  * Overloads the relevant methods of the real ResultsWrapper so it
  * doesn't go anywhere near an actual database.
@@ -56,3 +61,6 @@ class FakeResultWrapper extends ResultWrapper {
                return $this->fetchObject();
        }
 }
+
+class_alias( FakeResultWrapper::class, 'FakeResultWrapper' );
+
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 b591f4f..4e28397 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
+use stdClass;
+
 class MssqlResultWrapper extends ResultWrapper {
        /** @var integer|null */
        private $mSeekTo = null;
index 53109c8..d658c96 100644 (file)
@@ -1,4 +1,11 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
+use IDatabase;
+use stdClass;
+use RuntimeException;
+
 /**
  * Result wrapper for grabbing data queried from an IDatabase object
  *
@@ -15,7 +22,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 +52,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 );
@@ -107,7 +82,7 @@ class ResultWrapper implements Iterator {
         */
        private function getDB() {
                if ( !$this->db ) {
-                       throw new RuntimeException( get_class( $this ) . ' needs a DB handle for iteration.' );
+                       throw new RuntimeException( static::class . ' needs a DB handle for iteration.' );
                }
 
                return $this->db;
@@ -121,9 +96,6 @@ class ResultWrapper implements Iterator {
                $this->currentRow = null;
        }
 
-       /**
-        * @return stdClass|array|bool
-        */
        function current() {
                if ( is_null( $this->currentRow ) ) {
                        $this->next();
@@ -132,16 +104,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();
@@ -153,3 +119,5 @@ class ResultWrapper implements Iterator {
                return $this->current() !== false;
        }
 }
+
+class_alias( ResultWrapper::class, 'ResultWrapper' );
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 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..f05dabc 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();
        }
@@ -326,7 +336,7 @@ abstract class LBFactory implements ILBFactory {
                $masterPositions = array_fill( 0, count( $lbs ), false );
                foreach ( $lbs as $i => $lb ) {
                        if ( $lb->getServerCount() <= 1 ) {
-                               // Bug 27975 - Don't try to wait for replica DBs if there are none
+                               // T29975 - Don't try to wait for replica DBs if there are none
                                // Prevents permission error when getting master position
                                continue;
                        } elseif ( $opts['ifWritesSince']
index 4158e61..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.
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 fc306b4..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
@@ -228,9 +240,6 @@ interface ILoadBalancer {
         * 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 or DB_MASTER/DB_REPLICA
@@ -370,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 );
@@ -447,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 );
@@ -532,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 95f55b6..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 IDatabase[][][] 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 );
@@ -472,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;
@@ -703,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;
                }
 
@@ -732,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.
         *
@@ -764,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 );
@@ -785,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 );
@@ -795,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 );
                }
@@ -893,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})",
@@ -917,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 );
                }
        }
 
@@ -1336,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 ) {
@@ -1471,8 +1504,9 @@ class LoadBalancer implements ILoadBalancer {
 
        /**
         * @param IDatabase $conn
-        * @param DBMasterPos|false $pos
+        * @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' ) ) {
@@ -1571,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 e374794..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
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' ];
        }
 
        /**
diff --git a/includes/libs/time/ConvertibleTimestamp.php b/includes/libs/time/ConvertibleTimestamp.php
deleted file mode 100644 (file)
index c830b4e..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-<?php
-/**
- * Creation, parsing, and conversion of timestamps.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @since 1.20
- * @author Tyler Romeo, 2012
- */
-
-/**
- * Library for creating, parsing, and converting timestamps. Based on the JS
- * library that does the same thing.
- *
- * @since 1.28
- */
-class ConvertibleTimestamp {
-       /**
-        * Standard gmdate() formats for the different timestamp types.
-        */
-       private static $formats = [
-               TS_UNIX => 'U',
-               TS_MW => 'YmdHis',
-               TS_DB => 'Y-m-d H:i:s',
-               TS_ISO_8601 => 'Y-m-d\TH:i:s\Z',
-               TS_ISO_8601_BASIC => 'Ymd\THis\Z',
-               TS_EXIF => 'Y:m:d H:i:s', // This shouldn't ever be used, but is included for completeness
-               TS_RFC2822 => 'D, d M Y H:i:s',
-               TS_ORACLE => 'd-m-Y H:i:s.000000', // Was 'd-M-y h.i.s A' . ' +00:00' before r51500
-               TS_POSTGRES => 'Y-m-d H:i:s',
-       ];
-
-       /**
-        * The actual timestamp being wrapped (DateTime object).
-        * @var DateTime
-        */
-       public $timestamp;
-
-       /**
-        * Make a new timestamp and set it to the specified time,
-        * or the current time if unspecified.
-        *
-        * @param bool|string|int|float|DateTime $timestamp Timestamp to set, or false for current time
-        */
-       public function __construct( $timestamp = false ) {
-               if ( $timestamp instanceof DateTime ) {
-                       $this->timestamp = $timestamp;
-               } else {
-                       $this->setTimestamp( $timestamp );
-               }
-       }
-
-       /**
-        * Set the timestamp to the specified time, or the current time if unspecified.
-        *
-        * Parse the given timestamp into either a DateTime object or a Unix timestamp,
-        * and then store it.
-        *
-        * @param string|bool $ts Timestamp to store, or false for now
-        * @throws TimestampException
-        */
-       public function setTimestamp( $ts = false ) {
-               $m = [];
-               $da = [];
-               $strtime = '';
-
-               // We want to catch 0, '', null... but not date strings starting with a letter.
-               if ( !$ts || $ts === "\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ) {
-                       $uts = time();
-                       $strtime = "@$uts";
-               } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
-                       # TS_DB
-               } elseif ( preg_match( '/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
-                       # TS_EXIF
-               } elseif ( preg_match( '/^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/D', $ts, $da ) ) {
-                       # TS_MW
-               } elseif ( preg_match( '/^(-?\d{1,13})(\.\d+)?$/D', $ts, $m ) ) {
-                       # TS_UNIX
-                       $strtime = "@{$m[1]}"; // https://secure.php.net/manual/en/datetime.formats.compound.php
-               } elseif ( preg_match( '/^\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2}.\d{6}$/', $ts ) ) {
-                       # TS_ORACLE // session altered to DD-MM-YYYY HH24:MI:SS.FF6
-                       $strtime = preg_replace( '/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3",
-                               str_replace( '+00:00', 'UTC', $ts ) );
-               } elseif ( preg_match(
-                       '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z?$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_ISO_8601
-               } elseif ( preg_match(
-                       '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z?$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_ISO_8601_BASIC
-               } elseif ( preg_match(
-                       '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_POSTGRES
-               } elseif ( preg_match(
-                       '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_POSTGRES
-               } elseif ( preg_match(
-               # Day of week
-                       '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' .
-                       # dd Mon yyyy
-                       '\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' .
-                       # hh:mm:ss
-                       '[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S',
-                       $ts
-               ) ) {
-                       # TS_RFC2822, accepting a trailing comment.
-                       # See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html / r77171
-                       # The regex is a superset of rfc2822 for readability
-                       $strtime = strtok( $ts, ';' );
-               } elseif ( preg_match( '/^[A-Z][a-z]{5,8}, \d\d-[A-Z][a-z]{2}-\d{2} \d\d:\d\d:\d\d/', $ts ) ) {
-                       # TS_RFC850
-                       $strtime = $ts;
-               } elseif ( preg_match( '/^[A-Z][a-z]{2} [A-Z][a-z]{2} +\d{1,2} \d\d:\d\d:\d\d \d{4}/', $ts ) ) {
-                       # asctime
-                       $strtime = $ts;
-               } else {
-                       throw new TimestampException( __METHOD__ . ": Invalid timestamp - $ts" );
-               }
-
-               if ( !$strtime ) {
-                       $da = array_map( 'intval', $da );
-                       $da[0] = "%04d-%02d-%02dT%02d:%02d:%02d.00+00:00";
-                       $strtime = call_user_func_array( "sprintf", $da );
-               }
-
-               try {
-                       $final = new DateTime( $strtime, new DateTimeZone( 'GMT' ) );
-               } catch ( Exception $e ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timestamp format.', $e->getCode(), $e );
-               }
-
-               if ( $final === false ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timestamp format.' );
-               }
-
-               $this->timestamp = $final;
-       }
-
-       /**
-        * Convert a timestamp string to a given format.
-        *
-        * @param int $style Constant Output format for timestamp
-        * @param string $ts Timestamp
-        * @return string|bool Formatted timestamp or false on failure
-        */
-       public static function convert( $style = TS_UNIX, $ts ) {
-               try {
-                       $ct = new static( $ts );
-                       return $ct->getTimestamp( $style );
-               } catch ( TimestampException $e ) {
-                       return false;
-               }
-       }
-
-       /**
-        * Get the current time in the given format
-        *
-        * @param int $style Constant Output format for timestamp
-        * @return string
-        */
-       public static function now( $style = TS_MW ) {
-               return static::convert( $style, time() );
-       }
-
-       /**
-        * Get the timestamp represented by this object in a certain form.
-        *
-        * Convert the internal timestamp to the specified format and then
-        * return it.
-        *
-        * @param int $style Constant Output format for timestamp
-        * @throws TimestampException
-        * @return string The formatted timestamp
-        */
-       public function getTimestamp( $style = TS_UNIX ) {
-               if ( !isset( self::$formats[$style] ) ) {
-                       throw new TimestampException( __METHOD__ . ': Illegal timestamp output type.' );
-               }
-
-               $output = $this->timestamp->format( self::$formats[$style] );
-
-               if ( ( $style == TS_RFC2822 ) || ( $style == TS_POSTGRES ) ) {
-                       $output .= ' GMT';
-               }
-
-               if ( $style == TS_MW && strlen( $output ) !== 14 ) {
-                       throw new TimestampException( __METHOD__ . ': The timestamp cannot be represented in ' .
-                               'the specified format' );
-               }
-
-               return $output;
-       }
-
-       /**
-        * @return string
-        */
-       public function __toString() {
-               return $this->getTimestamp();
-       }
-
-       /**
-        * Calculate the difference between two ConvertibleTimestamp objects.
-        *
-        * @param ConvertibleTimestamp $relativeTo Base time to calculate difference from
-        * @return DateInterval|bool The DateInterval object representing the
-        *   difference between the two dates or false on failure
-        */
-       public function diff( ConvertibleTimestamp $relativeTo ) {
-               return $this->timestamp->diff( $relativeTo->timestamp );
-       }
-
-       /**
-        * Set the timezone of this timestamp to the specified timezone.
-        *
-        * @param string $timezone Timezone to set
-        * @throws TimestampException
-        */
-       public function setTimezone( $timezone ) {
-               try {
-                       $this->timestamp->setTimezone( new DateTimeZone( $timezone ) );
-               } catch ( Exception $e ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timezone.', $e->getCode(), $e );
-               }
-       }
-
-       /**
-        * Get the timezone of this timestamp.
-        *
-        * @return DateTimeZone The timezone
-        */
-       public function getTimezone() {
-               return $this->timestamp->getTimezone();
-       }
-
-       /**
-        * Format the timestamp in a given format.
-        *
-        * @param string $format Pattern to format in
-        * @return string The formatted timestamp
-        */
-       public function format( $format ) {
-               return $this->timestamp->format( $format );
-       }
-}
diff --git a/includes/libs/time/TimestampException.php b/includes/libs/time/TimestampException.php
deleted file mode 100644 (file)
index 36ffdee..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-/**
- * @since 1.20
- */
-class TimestampException extends Exception {
-}
diff --git a/includes/libs/time/defines.php b/includes/libs/time/defines.php
deleted file mode 100644 (file)
index ff4dde8..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/**
- * Unix time - the number of seconds since 1970-01-01 00:00:00 UTC
- */
-define( 'TS_UNIX', 0 );
-
-/**
- * MediaWiki concatenated string timestamp (YYYYMMDDHHMMSS)
- */
-define( 'TS_MW', 1 );
-
-/**
- * MySQL DATETIME (YYYY-MM-DD HH:MM:SS)
- */
-define( 'TS_DB', 2 );
-
-/**
- * RFC 2822 format, for E-mail and HTTP headers
- */
-define( 'TS_RFC2822', 3 );
-
-/**
- * ISO 8601 format with no timezone: 1986-02-09T20:00:00Z
- *
- * This is used by Special:Export
- */
-define( 'TS_ISO_8601', 4 );
-
-/**
- * An Exif timestamp (YYYY:MM:DD HH:MM:SS)
- *
- * @see http://exif.org/Exif2-2.PDF The Exif 2.2 spec, see page 28 for the
- *       DateTime tag and page 36 for the DateTimeOriginal and
- *       DateTimeDigitized tags.
- */
-define( 'TS_EXIF', 5 );
-
-/**
- * Oracle format time.
- */
-define( 'TS_ORACLE', 6 );
-
-/**
- * Postgres format time.
- */
-define( 'TS_POSTGRES', 7 );
-
-/**
- * ISO 8601 basic format with no timezone: 19860209T200000Z.  This is used by ResourceLoader
- */
-define( 'TS_ISO_8601_BASIC', 9 );
index ccb14db..2f16078 100644 (file)
@@ -51,8 +51,7 @@ abstract class VirtualRESTService {
         * @return string The name of the service behind this VRS object.
         */
        public function getName() {
-               return isset( $this->params['name'] ) ? $this->params['name'] :
-                       get_class( $this );
+               return isset( $this->params['name'] ) ? $this->params['name'] : static::class;
        }
 
        /**
index a657a33..f1df7f1 100644 (file)
@@ -647,7 +647,7 @@ class XMPReader implements LoggerAwareInterface {
        private function endElementNested( $elm ) {
 
                /* cur item must be the same as $elm, unless if in MODE_STRUCT
-                  in which case it could also be rdf:Description */
+                * in which case it could also be rdf:Description */
                if ( $this->curItem[0] !== $elm
                        && !( $elm === self::NS_RDF . ' Description'
                                && $this->mode[0] === self::MODE_STRUCT )
@@ -895,7 +895,7 @@ class XMPReader implements LoggerAwareInterface {
                if ( $elm === self::NS_RDF . ' Seq' ) {
                        array_unshift( $this->mode, self::MODE_LI );
                } elseif ( $elm === self::NS_RDF . ' Bag' ) {
-                       # bug 27105
+                       # T29105
                        $this->logger->info( __METHOD__ . ' Expected an rdf:Seq, but got an rdf:Bag. Pretending'
                                . ' it is a Seq, since some buggy software is known to screw this up.' );
                        array_unshift( $this->mode, self::MODE_LI );
@@ -1086,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;
                        }
index 052be33..5211a2c 100644 (file)
@@ -650,7 +650,7 @@ class XMPInfo {
                                'choices' => [ '1' => true, '2' => true ],
                        ],
                        /********
-                        * Disable extracting this property (bug 31944)
+                        * Disable extracting this property (T33944)
                         * Several files have a string instead of a Seq
                         * for this property. XMPReader doesn't handle
                         * mismatched types very gracefully (it marks
@@ -658,7 +658,7 @@ class XMPInfo {
                         * the relavent prop). Since this prop
                         * doesn't communicate all that useful information
                         * just disable this prop for now, until such
-                        * XMPReader is more graceful (bug 32172)
+                        * XMPReader is more graceful (T34172)
                         * 'YCbCrSubSampling'  => array(
                         *    'map_group' => 'exif',
                         *    'mode'      => XMPReader::MODE_SEQ,
index 31eaa3b..76ae279 100644 (file)
@@ -23,6 +23,7 @@
 
 use Psr\Log\LoggerInterface;
 use Psr\Log\LoggerAwareInterface;
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * This contains some static methods for
index c390232..a0bfb59 100644 (file)
@@ -59,9 +59,15 @@ class BlockLogFormatter extends LogFormatter {
                        // The lrm is needed to make sure that the number
                        // is shown on the correct side of the tooltip text.
                        $durationTooltip = '&lrm;' . htmlspecialchars( $params[4] );
-                       $params[4] = Message::rawParam( "<span class='blockExpiry' title='$durationTooltip'>" .
-                               $this->context->getLanguage()->translateBlockExpiry( $params[4],
-                                       $this->context->getUser() ) . '</span>' );
+                       $params[4] = Message::rawParam(
+                               "<span class='blockExpiry' title='$durationTooltip'>" .
+                               $this->context->getLanguage()->translateBlockExpiry(
+                                       $params[4],
+                                       $this->context->getUser(),
+                                       wfTimestamp( TS_UNIX, $this->entry->getTimestamp() )
+                               ) .
+                               '</span>'
+                       );
                        $params[5] = isset( $params[5] ) ?
                                self::formatBlockFlags( $params[5], $this->context->getLanguage() ) : '';
                }
index 6665336..4382910 100644 (file)
@@ -544,7 +544,8 @@ class LogEventsList extends ContextSource {
         * @param string $user The user who made the log entries
         * @param array $param Associative Array with the following additional options:
         * - lim Integer Limit of items to show, default is 50
-        * - conds Array Extra conditions for the query (e.g. "log_action != 'revision'")
+        * - conds Array Extra conditions for the query
+        *   (e.g. 'log_action != ' . $dbr->addQuotes( 'revision' ))
         * - showIfEmpty boolean Set to false if you don't want any output in case the loglist is empty
         *   if set to true (default), "No matching items in log" is displayed if loglist is empty
         * - msgKey Array If you want a nice box with a message, set this to the key of the message.
index a64fee1..68404bf 100644 (file)
@@ -167,7 +167,7 @@ class LogFormatter {
 
        /**
         * Even uglier hack to maintain backwards compatibilty with IRC bots
-        * (bug 34508).
+        * (T36508).
         * @see getActionText()
         * @return string Text
         */
@@ -188,7 +188,7 @@ class LogFormatter {
 
        /**
         * Even uglier hack to maintain backwards compatibilty with IRC bots
-        * (bug 34508).
+        * (T36508).
         * @see getActionText()
         * @return string Text
         */
@@ -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 68163c1..ea28ff2 100644 (file)
@@ -181,7 +181,7 @@ class LogPager extends ReverseChronologicalPager {
                } else {
                        $this->mConds['log_user'] = $userid;
                }
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                $user = $this->getUser();
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::DELETED_USER ) . ' = 0';
@@ -256,7 +256,7 @@ class LogPager extends ReverseChronologicalPager {
                } else {
                        $this->mConds['log_title'] = $title->getDBkey();
                }
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                $user = $this->getUser();
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::DELETED_ACTION ) . ' = 0';
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 1d0bdf6..d66e7e3 100644 (file)
@@ -316,7 +316,7 @@ class EmailNotification {
                $pageTitle = $this->title->getPrefixedText();
 
                if ( $this->oldid ) {
-                       // Always show a link to the diff which triggered the mail. See bug 32210.
+                       // Always show a link to the diff which triggered the mail. See T34210.
                        $keys['$NEWPAGE'] = "\n\n" . wfMessage( 'enotif_lastdiff',
                                        $this->title->getCanonicalURL( [ 'diff' => 'next', 'oldid' => $this->oldid ] ) )
                                        ->inContentLanguage()->text();
@@ -363,7 +363,7 @@ class EmailNotification {
                        Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() )
                );
 
-               # Replace this after transforming the message, bug 35019
+               # Replace this after transforming the message, T37019
                $postTransformKeys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
 
                // Now build message's subject and body
index 21effa0..3858f27 100644 (file)
@@ -103,9 +103,9 @@ class UserMailer {
         * @param string $subject Email's subject.
         * @param string $body Email's text or Array of two strings to be the text and html bodies
         * @param array $options:
-        *              'replyTo' MailAddress
-        *              'contentType' string default 'text/plain; charset=UTF-8'
-        *              'headers' array Extra headers to set
+        *     'replyTo' MailAddress
+        *     'contentType' string default 'text/plain; charset=UTF-8'
+        *     'headers' array Extra headers to set
         *
         * @throws MWException
         * @throws Exception
@@ -197,9 +197,9 @@ class UserMailer {
         * @param string $subject Email's subject.
         * @param string $body Email's text or Array of two strings to be the text and html bodies
         * @param array $options:
-        *              'replyTo' MailAddress
-        *              'contentType' string default 'text/plain; charset=UTF-8'
-        *              'headers' array Extra headers to set
+        *     'replyTo' MailAddress
+        *     'contentType' string default 'text/plain; charset=UTF-8'
+        *     'headers' array Extra headers to set
         *
         * @throws MWException
         * @throws Exception
index ac0564d..0f0b074 100644 (file)
@@ -150,7 +150,7 @@ class BitmapHandler extends TransformationalImageHandler {
                        if ( $params['interlace'] ) {
                                $animation_post = [ '-interlace', 'JPEG' ];
                        }
-                       # Sharpening, see bug 6193
+                       # Sharpening, see T8193
                        if ( ( $params['physicalWidth'] + $params['physicalHeight'] )
                                / ( $params['srcWidth'] + $params['srcHeight'] )
                                < $wgSharpenReductionThreshold
@@ -178,10 +178,10 @@ class BitmapHandler extends TransformationalImageHandler {
                                // be a total drag. :P
                                $scene = 0;
                        } elseif ( $this->isAnimatedImage( $image ) ) {
-                               // Coalesce is needed to scale animated GIFs properly (bug 1017).
+                               // Coalesce is needed to scale animated GIFs properly (T3017).
                                $animation_pre = [ '-coalesce' ];
                                // We optimize the output, but -optimize is broken,
-                               // use optimizeTransparency instead (bug 11822)
+                               // use optimizeTransparency instead (T13822)
                                if ( version_compare( $this->getMagickVersion(), "6.3.5" ) >= 0 ) {
                                        $animation_post = [ '-fuzz', '5%', '-layers', 'optimizeTransparency' ];
                                }
@@ -211,7 +211,7 @@ class BitmapHandler extends TransformationalImageHandler {
                                && $xcfMeta['colorType'] === 'greyscale-alpha'
                                && version_compare( $this->getMagickVersion(), "6.8.9-3" ) < 0
                        ) {
-                               // bug 66323 - Greyscale images not rendered properly.
+                               // T68323 - Greyscale images not rendered properly.
                                // So only take the "red" channel.
                                $channelOnly = [ '-channel', 'R', '-separate' ];
                                $animation_pre = array_merge( $animation_pre, $channelOnly );
@@ -283,7 +283,7 @@ class BitmapHandler extends TransformationalImageHandler {
                        $im->readImage( $params['srcPath'] );
 
                        if ( $params['mimeType'] == 'image/jpeg' ) {
-                               // Sharpening, see bug 6193
+                               // Sharpening, see T8193
                                if ( ( $params['physicalWidth'] + $params['physicalHeight'] )
                                        / ( $params['srcWidth'] + $params['srcHeight'] )
                                        < $wgSharpenReductionThreshold
@@ -312,7 +312,7 @@ class BitmapHandler extends TransformationalImageHandler {
                                        // be a total drag. :P
                                        $im->setImageScene( 0 );
                                } elseif ( $this->isAnimatedImage( $image ) ) {
-                                       // Coalesce is needed to scale animated GIFs properly (bug 1017).
+                                       // Coalesce is needed to scale animated GIFs properly (T3017).
                                        $im = $im->coalesceImages();
                                }
                                // GIF interlacing is only available since 6.3.4
index 5e8f8c8..57b5b36 100644 (file)
@@ -277,9 +277,9 @@ class DjVuImage {
                                $reg = <<<EOR
                                        /\(page\s[\d-]*\s[\d-]*\s[\d-]*\s[\d-]*\s*"
                                        ((?>    # Text to match is composed of atoms of either:
-                                         \\\\. # - any escaped character
-                                         |     # - any character different from " and \
-                                         [^"\\\\]+
+                                               \\\\. # - any escaped character
+                                               |     # - any character different from " and \
+                                               [^"\\\\]+
                                        )*?)
                                        "\s*\)
                                        | # Or page can be empty ; in this case, djvutxt dumps ()
index 51a0135..f237287 100644 (file)
@@ -24,6 +24,7 @@
  * @see http://exif.org/Exif2-2.PDF The Exif 2.2 specification
  * @file
  */
+use Wikimedia\Timestamp\TimestampException;
 
 /**
  * Format Image metadata values into a human readable form.
index 6c857a8..c9f0dfa 100644 (file)
@@ -112,8 +112,8 @@ class JpegHandler extends ExifBitmapHandler {
                        wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
 
                        /* This used to use 0 (ExifBitmapHandler::OLD_BROKEN_FILE) for the cases
-                        *      * No metadata in the file
-                        *      * Something is broken in the file.
+                        *   * No metadata in the file
+                        *   * Something is broken in the file.
                         * However, if the metadata support gets expanded then you can't tell if the 0 is from
                         * a broken file, or just no props found. A broken file is likely to stay broken, but
                         * a file which had no props could have props once the metadata support is improved.
index 2a735a2..6a23bd6 100644 (file)
@@ -762,7 +762,7 @@ abstract class MediaHandler {
         * @param string $cmd
         */
        protected function logErrorForExternalProcess( $retval, $err, $cmd ) {
-               # Keep error output limited (bug 57985)
+               # Keep error output limited (T59985)
                $errMessage = trim( substr( $err, 0, self::MAX_ERR_LOG_SIZE ) );
 
                wfDebugLog( 'thumbnail',
index 6a974c7..4087fb3 100644 (file)
@@ -86,13 +86,13 @@ class SVGReader {
                }
 
                // Expand entities, since Adobe Illustrator uses them for xmlns
-               // attributes (bug 31719). Note that libxml2 has some protection
+               // attributes (T33719). Note that libxml2 has some protection
                // against large recursive entity expansions so this is not as
                // insecure as it might appear to be. However, it is still extremely
                // insecure. It's necessary to wrap any read() calls with
                // libxml_disable_entity_loader() to avoid arbitrary local file
                // inclusion, or even arbitrary code execution if the expect
-               // extension is installed (bug 46859).
+               // extension is installed (T48859).
                $oldDisable = libxml_disable_entity_loader( true );
                $this->reader->setParserProperty( XMLReader::SUBST_ENTITIES, true );
 
index 60aec45..1ab0f36 100644 (file)
@@ -569,7 +569,7 @@ abstract class TransformationalImageHandler extends ImageHandler {
         */
        public function rotate( $file, $params ) {
                return new MediaTransformError( 'thumbnail_error', 0, 0,
-                       get_class( $this ) . ' rotation not implemented' );
+                       static::class . ' rotation not implemented' );
        }
 
        /**
index de49fc3..07581d7 100644 (file)
@@ -23,6 +23,8 @@
 
 use \MediaWiki\MediaWikiServices;
 use \Wikimedia\WaitConditionLoop;
+use \Wikimedia\Rdbms\TransactionProfiler;
+use Wikimedia\Rdbms\LoadBalancer;
 
 /**
  * Class to store objects in the database
@@ -403,7 +405,7 @@ class SqlBagOStuff extends BagOStuff {
                                $exptime = $this->convertExpiry( $exptime );
                                $encExpiry = $db->timestamp( $exptime );
                        }
-                       // (bug 24425) use a replace if the db supports it instead of
+                       // (T26425) use a replace if the db supports it instead of
                        // delete/insert to avoid clashes with conflicting keynames
                        $db->update(
                                $tableName,
@@ -478,7 +480,7 @@ class SqlBagOStuff extends BagOStuff {
                                ], __METHOD__, 'IGNORE' );
 
                        if ( $db->affectedRows() == 0 ) {
-                               // Race condition. See bug 28611
+                               // Race condition. See T30611
                                $newValue = null;
                        }
                } catch ( DBError $e ) {
index 4bcb655..e7a906d 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!
@@ -391,10 +373,9 @@ class Article implements Page {
                // Avoid PHP 7.1 warning of passing $this by reference
                $articlePage = $this;
 
-               ContentHandler::runLegacyHooks(
+               Hooks::run(
                        'ArticleAfterFetchContentObject',
-                       [ &$articlePage, &$this->mContentObject ],
-                       '1.21'
+                       [ &$articlePage, &$this->mContentObject ]
                );
 
                return $this->mContentObject;
@@ -745,7 +726,7 @@ class Article implements Page {
 
                $ns = $this->getTitle()->getNamespace();
 
-               # Don't index user and user talk pages for blocked users (bug 11443)
+               # Don't index user and user talk pages for blocked users (T13443)
                if ( ( $ns == NS_USER || $ns == NS_USER_TALK ) && !$this->getTitle()->isSubpage() ) {
                        $specificTarget = null;
                        $vagueTarget = null;
@@ -803,7 +784,7 @@ class Article implements Page {
                }
 
                if ( isset( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] ) ) {
-                       # (bug 14900) site config can override user-defined __INDEX__ or __NOINDEX__
+                       # (T16900) site config can override user-defined __INDEX__ or __NOINDEX__
                        $policy = array_merge(
                                $policy,
                                self::formatRobotPolicy( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] )
@@ -1190,7 +1171,10 @@ class Article implements Page {
                $loggedIn = $this->getContext()->getUser()->isLoggedIn();
                if ( $loggedIn || $cache->get( $key ) ) {
                        $logTypes = [ 'delete', 'move' ];
-                       $conds = [ "log_action != 'revision'" ];
+
+                       $dbr = wfGetDB( DB_REPLICA );
+
+                       $conds = [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ];
                        // Give extensions a chance to hide their (unrelated) log entries
                        Hooks::run( 'Article::MissingArticleConditions', [ &$conds, $logTypes ] );
                        LogEventsList::showLogExtract(
@@ -1687,7 +1671,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(),
@@ -1697,7 +1680,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' ] ) .
@@ -2037,22 +2019,13 @@ class Article implements Page {
 
        /**
         * Call to WikiPage function for backwards compatibility.
-        * @see WikiPage::doEdit
-        *
-        * @deprecated since 1.21: use doEditContent() instead.
-        */
-       public function doEdit( $text, $summary, $flags = 0, $baseRevId = false, $user = null ) {
-               wfDeprecated( __METHOD__, '1.21' );
-               return $this->mPage->doEdit( $text, $summary, $flags, $baseRevId, $user );
-       }
-
-       /**
-        * Call to WikiPage function for backwards compatibility.
+        * @deprecated since 1.29. Use WikiPage::doEditContent() directly instead
         * @see WikiPage::doEditContent
         */
        public function doEditContent( Content $content, $summary, $flags = 0, $baseRevId = false,
                User $user = null, $serialFormat = null
        ) {
+               wfDeprecated( __METHOD__, '1.29' );
                return $this->mPage->doEditContent( $content, $summary, $flags, $baseRevId,
                        $user, $serialFormat
                );
index b60b010..f8202a6 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Class for viewing MediaWiki file description pages
  *
@@ -213,7 +215,7 @@ class ImagePage extends Article {
                }
 
                $out->addModuleStyles( [
-                       'filepage', // always show the local local Filepage.css, bug 29277
+                       'filepage', // always show the local local Filepage.css, T31277
                        'mediawiki.action.view.filepage', // Add MediaWiki styles for a file page
                ] );
        }
@@ -336,7 +338,7 @@ class ImagePage extends Article {
                        $filename = wfEscapeWikiText( $this->displayImg->getName() );
                        $linktext = $filename;
 
-                       // Use of &$this in hooks triggers warnings in PHP 7.1
+                       // Avoid PHP 7.1 warning from passing $this by reference
                        $imagePage = $this;
 
                        Hooks::run( 'ImageOpenShowImageInlineBefore', [ &$imagePage, &$out ] );
@@ -534,7 +536,7 @@ class ImagePage extends Article {
                                // this will get messy.
                                // The dirmark, however, must not be immediately adjacent
                                // to the filename, because it can get copied with it.
-                               // See bug 25277.
+                               // See T27277.
                                // @codingStandardsIgnoreStart Ignore long line
                                $out->addWikiText( <<<EOT
 <div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
@@ -585,6 +587,8 @@ EOT
                } else {
                        # Image does not exist
                        if ( !$this->getId() ) {
+                               $dbr = wfGetDB( DB_REPLICA );
+
                                # No article exists either
                                # Show deletion log to be consistent with normal articles
                                LogEventsList::showLogExtract(
@@ -593,7 +597,7 @@ EOT
                                        $this->getTitle()->getPrefixedText(),
                                        '',
                                        [ 'lim' => 10,
-                                               'conds' => [ "log_action != 'revision'" ],
+                                               'conds' => [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ],
                                                'showIfEmpty' => false,
                                                'msgKey' => [ 'moveddeleted-notice' ]
                                        ]
diff --git a/includes/page/PageArchive.php b/includes/page/PageArchive.php
new file mode 100644 (file)
index 0000000..388e693
--- /dev/null
@@ -0,0 +1,743 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+
+/**
+ * Used to show archived pages and eventually restore them.
+ */
+class PageArchive {
+       /** @var Title */
+       protected $title;
+
+       /** @var Status */
+       protected $fileStatus;
+
+       /** @var Status */
+       protected $revisionStatus;
+
+       /** @var Config */
+       protected $config;
+
+       public function __construct( $title, Config $config = null ) {
+               if ( is_null( $title ) ) {
+                       throw new MWException( __METHOD__ . ' given a null title.' );
+               }
+               $this->title = $title;
+               if ( $config === null ) {
+                       wfDebug( __METHOD__ . ' did not have a Config object passed to it' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
+               }
+               $this->config = $config;
+       }
+
+       public function doesWrites() {
+               return true;
+       }
+
+       /**
+        * List all deleted pages recorded in the archive table. Returns result
+        * wrapper with (ar_namespace, ar_title, count) fields, ordered by page
+        * namespace/title.
+        *
+        * @return ResultWrapper
+        */
+       public static function listAllPages() {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               return self::listPages( $dbr, '' );
+       }
+
+       /**
+        * List deleted pages recorded in the archive table matching the
+        * given title prefix.
+        * Returns result wrapper with (ar_namespace, ar_title, count) fields.
+        *
+        * @param string $prefix Title prefix
+        * @return ResultWrapper
+        */
+       public static function listPagesByPrefix( $prefix ) {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               $title = Title::newFromText( $prefix );
+               if ( $title ) {
+                       $ns = $title->getNamespace();
+                       $prefix = $title->getDBkey();
+               } else {
+                       // Prolly won't work too good
+                       // @todo handle bare namespace names cleanly?
+                       $ns = 0;
+               }
+
+               $conds = [
+                       'ar_namespace' => $ns,
+                       'ar_title' . $dbr->buildLike( $prefix, $dbr->anyString() ),
+               ];
+
+               return self::listPages( $dbr, $conds );
+       }
+
+       /**
+        * @param IDatabase $dbr
+        * @param string|array $condition
+        * @return bool|ResultWrapper
+        */
+       protected static function listPages( $dbr, $condition ) {
+               return $dbr->select(
+                       [ 'archive' ],
+                       [
+                               'ar_namespace',
+                               'ar_title',
+                               'count' => 'COUNT(*)'
+                       ],
+                       $condition,
+                       __METHOD__,
+                       [
+                               'GROUP BY' => [ 'ar_namespace', 'ar_title' ],
+                               'ORDER BY' => [ 'ar_namespace', 'ar_title' ],
+                               'LIMIT' => 100,
+                       ]
+               );
+       }
+
+       /**
+        * List the revisions of the given page. Returns result wrapper with
+        * (ar_minor_edit, ar_timestamp, ar_user, ar_user_text, ar_comment) fields.
+        *
+        * @return ResultWrapper
+        */
+       public function listRevisions() {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               $tables = [ 'archive' ];
+
+               $fields = [
+                       'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text',
+                       'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1',
+               ];
+
+               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
+                       $fields[] = 'ar_content_format';
+                       $fields[] = 'ar_content_model';
+               }
+
+               $conds = [ 'ar_namespace' => $this->title->getNamespace(),
+                       'ar_title' => $this->title->getDBkey() ];
+
+               $options = [ 'ORDER BY' => 'ar_timestamp DESC' ];
+
+               $join_conds = [];
+
+               ChangeTags::modifyDisplayQuery(
+                       $tables,
+                       $fields,
+                       $conds,
+                       $join_conds,
+                       $options,
+                       ''
+               );
+
+               return $dbr->select( $tables,
+                       $fields,
+                       $conds,
+                       __METHOD__,
+                       $options,
+                       $join_conds
+               );
+       }
+
+       /**
+        * List the deleted file revisions for this page, if it's a file page.
+        * Returns a result wrapper with various filearchive fields, or null
+        * if not a file page.
+        *
+        * @return ResultWrapper
+        * @todo Does this belong in Image for fuller encapsulation?
+        */
+       public function listFiles() {
+               if ( $this->title->getNamespace() != NS_FILE ) {
+                       return null;
+               }
+
+               $dbr = wfGetDB( DB_REPLICA );
+               return $dbr->select(
+                       'filearchive',
+                       ArchivedFile::selectFields(),
+                       [ 'fa_name' => $this->title->getDBkey() ],
+                       __METHOD__,
+                       [ 'ORDER BY' => 'fa_timestamp DESC' ]
+               );
+       }
+
+       /**
+        * Return a Revision object containing data for the deleted revision.
+        * Note that the result *may* or *may not* have a null page ID.
+        *
+        * @param string $timestamp
+        * @return Revision|null
+        */
+       public function getRevision( $timestamp ) {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               $fields = [
+                       'ar_rev_id',
+                       'ar_text',
+                       'ar_comment',
+                       'ar_user',
+                       'ar_user_text',
+                       'ar_timestamp',
+                       'ar_minor_edit',
+                       'ar_flags',
+                       'ar_text_id',
+                       'ar_deleted',
+                       'ar_len',
+                       'ar_sha1',
+               ];
+
+               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
+                       $fields[] = 'ar_content_format';
+                       $fields[] = 'ar_content_model';
+               }
+
+               $row = $dbr->selectRow( 'archive',
+                       $fields,
+                       [ 'ar_namespace' => $this->title->getNamespace(),
+                               'ar_title' => $this->title->getDBkey(),
+                               'ar_timestamp' => $dbr->timestamp( $timestamp ) ],
+                       __METHOD__ );
+
+               if ( $row ) {
+                       return Revision::newFromArchiveRow( $row, [ 'title' => $this->title ] );
+               }
+
+               return null;
+       }
+
+       /**
+        * Return the most-previous revision, either live or deleted, against
+        * the deleted revision given by timestamp.
+        *
+        * May produce unexpected results in case of history merges or other
+        * unusual time issues.
+        *
+        * @param string $timestamp
+        * @return Revision|null Null when there is no previous revision
+        */
+       public function getPreviousRevision( $timestamp ) {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               // Check the previous deleted revision...
+               $row = $dbr->selectRow( 'archive',
+                       'ar_timestamp',
+                       [ 'ar_namespace' => $this->title->getNamespace(),
+                               'ar_title' => $this->title->getDBkey(),
+                               'ar_timestamp < ' .
+                               $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ],
+                       __METHOD__,
+                       [
+                               'ORDER BY' => 'ar_timestamp DESC',
+                               'LIMIT' => 1 ] );
+               $prevDeleted = $row ? wfTimestamp( TS_MW, $row->ar_timestamp ) : false;
+
+               $row = $dbr->selectRow( [ 'page', 'revision' ],
+                       [ 'rev_id', 'rev_timestamp' ],
+                       [
+                               'page_namespace' => $this->title->getNamespace(),
+                               'page_title' => $this->title->getDBkey(),
+                               'page_id = rev_page',
+                               'rev_timestamp < ' .
+                               $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ],
+                       __METHOD__,
+                       [
+                               'ORDER BY' => 'rev_timestamp DESC',
+                               'LIMIT' => 1 ] );
+               $prevLive = $row ? wfTimestamp( TS_MW, $row->rev_timestamp ) : false;
+               $prevLiveId = $row ? intval( $row->rev_id ) : null;
+
+               if ( $prevLive && $prevLive > $prevDeleted ) {
+                       // Most prior revision was live
+                       return Revision::newFromId( $prevLiveId );
+               } elseif ( $prevDeleted ) {
+                       // Most prior revision was deleted
+                       return $this->getRevision( $prevDeleted );
+               }
+
+               // No prior revision on this page.
+               return null;
+       }
+
+       /**
+        * Get the text from an archive row containing ar_text, ar_flags and ar_text_id
+        *
+        * @param object $row Database row
+        * @return string
+        */
+       public function getTextFromRow( $row ) {
+               if ( is_null( $row->ar_text_id ) ) {
+                       // An old row from MediaWiki 1.4 or previous.
+                       // Text is embedded in this row in classic compression format.
+                       return Revision::getRevisionText( $row, 'ar_' );
+               }
+
+               // New-style: keyed to the text storage backend.
+               $dbr = wfGetDB( DB_REPLICA );
+               $text = $dbr->selectRow( 'text',
+                       [ 'old_text', 'old_flags' ],
+                       [ 'old_id' => $row->ar_text_id ],
+                       __METHOD__ );
+
+               return Revision::getRevisionText( $text );
+       }
+
+       /**
+        * Fetch (and decompress if necessary) the stored text of the most
+        * recently edited deleted revision of the page.
+        *
+        * If there are no archived revisions for the page, returns NULL.
+        *
+        * @return string|null
+        */
+       public function getLastRevisionText() {
+               $dbr = wfGetDB( DB_REPLICA );
+               $row = $dbr->selectRow( 'archive',
+                       [ 'ar_text', 'ar_flags', 'ar_text_id' ],
+                       [ 'ar_namespace' => $this->title->getNamespace(),
+                               'ar_title' => $this->title->getDBkey() ],
+                       __METHOD__,
+                       [ 'ORDER BY' => 'ar_timestamp DESC' ] );
+
+               if ( $row ) {
+                       return $this->getTextFromRow( $row );
+               }
+
+               return null;
+       }
+
+       /**
+        * Quick check if any archived revisions are present for the page.
+        *
+        * @return bool
+        */
+       public function isDeleted() {
+               $dbr = wfGetDB( DB_REPLICA );
+               $n = $dbr->selectField( 'archive', 'COUNT(ar_title)',
+                       [ 'ar_namespace' => $this->title->getNamespace(),
+                               'ar_title' => $this->title->getDBkey() ],
+                       __METHOD__
+               );
+
+               return ( $n > 0 );
+       }
+
+       /**
+        * Restore the given (or all) text and file revisions for the page.
+        * Once restored, the items will be removed from the archive tables.
+        * The deletion log will be updated with an undeletion notice.
+        *
+        * This also sets Status objects, $this->fileStatus and $this->revisionStatus
+        * (depending what operations are attempted).
+        *
+        * @param array $timestamps Pass an empty array to restore all revisions,
+        *   otherwise list the ones to undelete.
+        * @param string $comment
+        * @param array $fileVersions
+        * @param bool $unsuppress
+        * @param User $user User performing the action, or null to use $wgUser
+        * @param string|string[] $tags Change tags to add to log entry
+        *   ($user should be able to add the specified tags before this is called)
+        * @return array|bool array(number of file revisions restored, number of image revisions
+        *   restored, log message) on success, false on failure.
+        */
+       public function undelete( $timestamps, $comment = '', $fileVersions = [],
+               $unsuppress = false, User $user = null, $tags = null
+       ) {
+               // If both the set of text revisions and file revisions are empty,
+               // restore everything. Otherwise, just restore the requested items.
+               $restoreAll = empty( $timestamps ) && empty( $fileVersions );
+
+               $restoreText = $restoreAll || !empty( $timestamps );
+               $restoreFiles = $restoreAll || !empty( $fileVersions );
+
+               if ( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
+                       $img = wfLocalFile( $this->title );
+                       $img->load( File::READ_LATEST );
+                       $this->fileStatus = $img->restore( $fileVersions, $unsuppress );
+                       if ( !$this->fileStatus->isOK() ) {
+                               return false;
+                       }
+                       $filesRestored = $this->fileStatus->successCount;
+               } else {
+                       $filesRestored = 0;
+               }
+
+               if ( $restoreText ) {
+                       $this->revisionStatus = $this->undeleteRevisions( $timestamps, $unsuppress, $comment );
+                       if ( !$this->revisionStatus->isOK() ) {
+                               return false;
+                       }
+
+                       $textRestored = $this->revisionStatus->getValue();
+               } else {
+                       $textRestored = 0;
+               }
+
+               // Touch the log!
+
+               if ( $textRestored && $filesRestored ) {
+                       $reason = wfMessage( 'undeletedrevisions-files' )
+                               ->numParams( $textRestored, $filesRestored )->inContentLanguage()->text();
+               } elseif ( $textRestored ) {
+                       $reason = wfMessage( 'undeletedrevisions' )->numParams( $textRestored )
+                               ->inContentLanguage()->text();
+               } elseif ( $filesRestored ) {
+                       $reason = wfMessage( 'undeletedfiles' )->numParams( $filesRestored )
+                               ->inContentLanguage()->text();
+               } else {
+                       wfDebug( "Undelete: nothing undeleted...\n" );
+
+                       return false;
+               }
+
+               if ( trim( $comment ) != '' ) {
+                       $reason .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
+               }
+
+               if ( $user === null ) {
+                       global $wgUser;
+                       $user = $wgUser;
+               }
+
+               $logEntry = new ManualLogEntry( 'delete', 'restore' );
+               $logEntry->setPerformer( $user );
+               $logEntry->setTarget( $this->title );
+               $logEntry->setComment( $reason );
+               $logEntry->setTags( $tags );
+
+               Hooks::run( 'ArticleUndeleteLogEntry', [ $this, &$logEntry, $user ] );
+
+               $logid = $logEntry->insert();
+               $logEntry->publish( $logid );
+
+               return [ $textRestored, $filesRestored, $reason ];
+       }
+
+       /**
+        * This is the meaty bit -- It restores archived revisions of the given page
+        * to the revision table.
+        *
+        * @param array $timestamps Pass an empty array to restore all revisions,
+        *   otherwise list the ones to undelete.
+        * @param bool $unsuppress Remove all ar_deleted/fa_deleted restrictions of seletected revs
+        * @param string $comment
+        * @throws ReadOnlyError
+        * @return Status Status object containing the number of revisions restored on success
+        */
+       private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
+               if ( wfReadOnly() ) {
+                       throw new ReadOnlyError();
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->startAtomic( __METHOD__ );
+
+               $restoreAll = empty( $timestamps );
+
+               # Does this page already exist? We'll have to update it...
+               $article = WikiPage::factory( $this->title );
+               # Load latest data for the current page (T33179)
+               $article->loadPageData( 'fromdbmaster' );
+               $oldcountable = $article->isCountable();
+
+               $page = $dbw->selectRow( 'page',
+                       [ 'page_id', 'page_latest' ],
+                       [ 'page_namespace' => $this->title->getNamespace(),
+                               'page_title' => $this->title->getDBkey() ],
+                       __METHOD__,
+                       [ 'FOR UPDATE' ] // lock page
+               );
+
+               if ( $page ) {
+                       $makepage = false;
+                       # Page already exists. Import the history, and if necessary
+                       # we'll update the latest revision field in the record.
+
+                       # Get the time span of this page
+                       $previousTimestamp = $dbw->selectField( 'revision', 'rev_timestamp',
+                               [ 'rev_id' => $page->page_latest ],
+                               __METHOD__ );
+
+                       if ( $previousTimestamp === false ) {
+                               wfDebug( __METHOD__ . ": existing page refers to a page_latest that does not exist\n" );
+
+                               $status = Status::newGood( 0 );
+                               $status->warning( 'undeleterevision-missing' );
+                               $dbw->endAtomic( __METHOD__ );
+
+                               return $status;
+                       }
+               } else {
+                       # Have to create a new article...
+                       $makepage = true;
+                       $previousTimestamp = 0;
+               }
+
+               $oldWhere = [
+                       'ar_namespace' => $this->title->getNamespace(),
+                       'ar_title' => $this->title->getDBkey(),
+               ];
+               if ( !$restoreAll ) {
+                       $oldWhere['ar_timestamp'] = array_map( [ &$dbw, 'timestamp' ], $timestamps );
+               }
+
+               $fields = [
+                       'ar_id',
+                       'ar_rev_id',
+                       'rev_id',
+                       'ar_text',
+                       'ar_comment',
+                       'ar_user',
+                       'ar_user_text',
+                       'ar_timestamp',
+                       'ar_minor_edit',
+                       'ar_flags',
+                       'ar_text_id',
+                       'ar_deleted',
+                       'ar_page_id',
+                       'ar_len',
+                       'ar_sha1'
+               ];
+
+               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
+                       $fields[] = 'ar_content_format';
+                       $fields[] = 'ar_content_model';
+               }
+
+               /**
+                * Select each archived revision...
+                */
+               $result = $dbw->select(
+                       [ 'archive', 'revision' ],
+                       $fields,
+                       $oldWhere,
+                       __METHOD__,
+                       /* options */
+                       [ 'ORDER BY' => 'ar_timestamp' ],
+                       [ 'revision' => [ 'LEFT JOIN', 'ar_rev_id=rev_id' ] ]
+               );
+
+               $rev_count = $result->numRows();
+               if ( !$rev_count ) {
+                       wfDebug( __METHOD__ . ": no revisions to restore\n" );
+
+                       $status = Status::newGood( 0 );
+                       $status->warning( "undelete-no-results" );
+                       $dbw->endAtomic( __METHOD__ );
+
+                       return $status;
+               }
+
+               // We use ar_id because there can be duplicate ar_rev_id even for the same
+               // page.  In this case, we may be able to restore the first one.
+               $restoreFailedArIds = [];
+
+               // Map rev_id to the ar_id that is allowed to use it.  When checking later,
+               // if it doesn't match, the current ar_id can not be restored.
+
+               // Value can be an ar_id or -1 (-1 means no ar_id can use it, since the
+               // rev_id is taken before we even start the restore).
+               $allowedRevIdToArIdMap = [];
+
+               $latestRestorableRow = null;
+
+               foreach ( $result as $row ) {
+                       if ( $row->ar_rev_id ) {
+                               // rev_id is taken even before we start restoring.
+                               if ( $row->ar_rev_id === $row->rev_id ) {
+                                       $restoreFailedArIds[] = $row->ar_id;
+                                       $allowedRevIdToArIdMap[$row->ar_rev_id] = -1;
+                               } else {
+                                       // rev_id is not taken yet in the DB, but it might be taken
+                                       // by a prior revision in the same restore operation. If
+                                       // not, we need to reserve it.
+                                       if ( isset( $allowedRevIdToArIdMap[$row->ar_rev_id] ) ) {
+                                               $restoreFailedArIds[] = $row->ar_id;
+                                       } else {
+                                               $allowedRevIdToArIdMap[$row->ar_rev_id] = $row->ar_id;
+                                               $latestRestorableRow = $row;
+                                       }
+                               }
+                       } else {
+                               // If ar_rev_id is null, there can't be a collision, and a
+                               // rev_id will be chosen automatically.
+                               $latestRestorableRow = $row;
+                       }
+               }
+
+               $result->seek( 0 ); // move back
+
+               $oldPageId = 0;
+               if ( $latestRestorableRow !== null ) {
+                       $oldPageId = (int)$latestRestorableRow->ar_page_id; // pass this to ArticleUndelete hook
+
+                       // grab the content to check consistency with global state before restoring the page.
+                       $revision = Revision::newFromArchiveRow( $latestRestorableRow,
+                               [
+                                       'title' => $article->getTitle(), // used to derive default content model
+                               ]
+                       );
+                       $user = User::newFromName( $revision->getUserText( Revision::RAW ), false );
+                       $content = $revision->getContent( Revision::RAW );
+
+                       // NOTE: article ID may not be known yet. prepareSave() should not modify the database.
+                       $status = $content->prepareSave( $article, 0, -1, $user );
+                       if ( !$status->isOK() ) {
+                               $dbw->endAtomic( __METHOD__ );
+
+                               return $status;
+                       }
+               }
+
+               $newid = false; // newly created page ID
+               $restored = 0; // number of revisions restored
+               /** @var Revision $revision */
+               $revision = null;
+
+               // If there are no restorable revisions, we can skip most of the steps.
+               if ( $latestRestorableRow === null ) {
+                       $failedRevisionCount = $rev_count;
+               } else {
+                       if ( $makepage ) {
+                               // Check the state of the newest to-be version...
+                               if ( !$unsuppress
+                                       && ( $latestRestorableRow->ar_deleted & Revision::DELETED_TEXT )
+                               ) {
+                                       $dbw->endAtomic( __METHOD__ );
+
+                                       return Status::newFatal( "undeleterevdel" );
+                               }
+                               // Safe to insert now...
+                               $newid = $article->insertOn( $dbw, $latestRestorableRow->ar_page_id );
+                               if ( $newid === false ) {
+                                       // The old ID is reserved; let's pick another
+                                       $newid = $article->insertOn( $dbw );
+                               }
+                               $pageId = $newid;
+                       } else {
+                               // Check if a deleted revision will become the current revision...
+                               if ( $latestRestorableRow->ar_timestamp > $previousTimestamp ) {
+                                       // Check the state of the newest to-be version...
+                                       if ( !$unsuppress
+                                               && ( $latestRestorableRow->ar_deleted & Revision::DELETED_TEXT )
+                                       ) {
+                                               $dbw->endAtomic( __METHOD__ );
+
+                                               return Status::newFatal( "undeleterevdel" );
+                                       }
+                               }
+
+                               $newid = false;
+                               $pageId = $article->getId();
+                       }
+
+                       foreach ( $result as $row ) {
+                               // Check for key dupes due to needed archive integrity.
+                               if ( $row->ar_rev_id && $allowedRevIdToArIdMap[$row->ar_rev_id] !== $row->ar_id ) {
+                                       continue;
+                               }
+                               // Insert one revision at a time...maintaining deletion status
+                               // unless we are specifically removing all restrictions...
+                               $revision = Revision::newFromArchiveRow( $row,
+                                       [
+                                               'page' => $pageId,
+                                               'title' => $this->title,
+                                               'deleted' => $unsuppress ? 0 : $row->ar_deleted
+                                       ] );
+
+                               $revision->insertOn( $dbw );
+                               $restored++;
+
+                               Hooks::run( 'ArticleRevisionUndeleted',
+                                       [ &$this->title, $revision, $row->ar_page_id ] );
+                       }
+
+                       // Now that it's safely stored, take it out of the archive
+                       // Don't delete rows that we failed to restore
+                       $toDeleteConds = $oldWhere;
+                       $failedRevisionCount = count( $restoreFailedArIds );
+                       if ( $failedRevisionCount > 0 ) {
+                               $toDeleteConds[] = 'ar_id NOT IN ( ' . $dbw->makeList( $restoreFailedArIds ) . ' )';
+                       }
+
+                       $dbw->delete( 'archive',
+                               $toDeleteConds,
+                               __METHOD__ );
+               }
+
+               $status = Status::newGood( $restored );
+
+               if ( $failedRevisionCount > 0 ) {
+                       $status->warning(
+                               wfMessage( 'undeleterevision-duplicate-revid', $failedRevisionCount ) );
+               }
+
+               // Was anything restored at all?
+               if ( $restored ) {
+                       $created = (bool)$newid;
+                       // Attach the latest revision to the page...
+                       $wasnew = $article->updateIfNewerOn( $dbw, $revision );
+                       if ( $created || $wasnew ) {
+                               // Update site stats, link tables, etc
+                               $article->doEditUpdates(
+                                       $revision,
+                                       User::newFromName( $revision->getUserText( Revision::RAW ), false ),
+                                       [
+                                               'created' => $created,
+                                               'oldcountable' => $oldcountable,
+                                               'restored' => true
+                                       ]
+                               );
+                       }
+
+                       Hooks::run( 'ArticleUndelete', [ &$this->title, $created, $comment, $oldPageId ] );
+                       if ( $this->title->getNamespace() == NS_FILE ) {
+                               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->title, 'imagelinks' ) );
+                       }
+               }
+
+               $dbw->endAtomic( __METHOD__ );
+
+               return $status;
+       }
+
+       /**
+        * @return Status
+        */
+       public function getFileStatus() {
+               return $this->fileStatus;
+       }
+
+       /**
+        * @return Status
+        */
+       public function getRevisionStatus() {
+               return $this->revisionStatus;
+       }
+}
index 1fa4bfa..e4b524b 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\FakeResultWrapper;
+
 /**
  * Special handling for file pages
  *
index 0f1efe7..4bc8ad6 100644 (file)
@@ -22,6 +22,7 @@
 
 use \MediaWiki\Logger\LoggerFactory;
 use \MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * Class representing a MediaWiki article and history.
@@ -151,7 +152,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @return WikiPage|null
         */
        public static function newFromID( $id, $from = 'fromdb' ) {
-               // page id's are never 0 or negative, see bug 61166
+               // page ids are never 0 or negative, see T63166
                if ( $id < 1 ) {
                        return null;
                }
@@ -257,7 +258,7 @@ class WikiPage implements Page, IDBAccessObject {
                $this->mTimestamp = '';
                $this->mIsRedirect = false;
                $this->mLatest = false;
-               // Bug 57026: do not clear mPreparedEdit since prepareTextForEdit() already checks
+               // T59026: do not clear mPreparedEdit since prepareTextForEdit() already checks
                // the requested rev ID and content against the cached one for equality. For most
                // content types, the output should not change during the lifetime of this cache.
                // Clearing it can cause extra parses on edit for no reason.
@@ -323,7 +324,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__, $options );
 
-               Hooks::run( 'ArticlePageDataAfter', [ &$this, &$row ] );
+               Hooks::run( 'ArticlePageDataAfter', [ &$wikiPage, &$row ] );
 
                return $row;
        }
@@ -424,7 +425,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $this->mLinksUpdated = wfTimestampOrNull( TS_MW, $data->page_links_updated );
                        $this->mIsRedirect = intval( $data->page_is_redirect );
                        $this->mLatest = intval( $data->page_latest );
-                       // Bug 37225: $latest may no longer match the cached latest Revision object.
+                       // T39225: $latest may no longer match the cached latest Revision object.
                        // Double-check the ID of any cached latest Revision object for consistency.
                        if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
                                $this->mLastRevision = null;
@@ -582,12 +583,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__,
                                [
@@ -621,7 +620,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                if ( $this->mDataLoadedFrom == self::READ_LOCKING ) {
-                       // Bug 37225: if session S1 loads the page row FOR UPDATE, the result always
+                       // T39225: if session S1 loads the page row FOR UPDATE, the result always
                        // includes the latest changes committed. This is true even within REPEATABLE-READ
                        // transactions, where S1 normally only sees changes committed before the first S1
                        // SELECT. Thus we need S1 to also gets the revision row FOR UPDATE; otherwise, it
@@ -1462,7 +1461,7 @@ class WikiPage implements Page, IDBAccessObject {
                                        $this->getContentHandler()->getModelID() );
                        }
 
-                       // Bug 30711: always use current version when adding a new section
+                       // T32711: always use current version when adding a new section
                        if ( is_null( $baseRevId ) || $sectionId === 'new' ) {
                                $oldContent = $this->getContent();
                        } else {
@@ -1504,68 +1503,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.
@@ -1663,9 +1600,7 @@ class WikiPage implements Page, IDBAccessObject {
                $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' );
@@ -1761,7 +1696,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                        return $status;
                } elseif ( !$oldContent ) {
-                       // Sanity check for bug 37225
+                       // Sanity check for T39225
                        throw new MWException( "Could not find text for current revision {$oldid}." );
                }
 
@@ -1849,7 +1784,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $dbw->endAtomic( __METHOD__ );
                        $this->mTimestamp = $now;
                } else {
-                       // Bug 32948: revision ID must be set to page {{REVISIONID}} and
+                       // T34948: revision ID must be set to page {{REVISIONID}} and
                        // related variables correctly. Likewise for {{REVISIONUSER}} (T135261).
                        $revision->setId( $this->getLatest() );
                        $revision->setUserIdAndName(
@@ -1893,7 +1828,6 @@ class WikiPage implements Page, IDBAccessObject {
                                        $params = [ &$wikiPage, &$user, $content, $summary, $flags & EDIT_MINOR,
                                                null, null, &$flags, $revision, &$status, $meta['baseRevId'],
                                                $meta['undidRevId'] ];
-                                       ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
                                        Hooks::run( 'PageContentSaveComplete', $params );
                                }
                        ),
@@ -2015,13 +1949,10 @@ class WikiPage implements Page, IDBAccessObject {
                                        // Trigger post-create hook
                                        $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
@@ -2093,7 +2024,7 @@ class WikiPage implements Page, IDBAccessObject {
                $user = is_null( $user ) ? $wgUser : $user;
                // XXX: check $user->getId() here???
 
-               // Use a sane default for $serialFormat, see bug 57026
+               // Use a sane default for $serialFormat, see T59026
                if ( $serialFormat === null ) {
                        $serialFormat = $content->getContentHandler()->getDefaultFormat();
                }
@@ -2156,8 +2087,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)',
                                                [],
@@ -2261,7 +2196,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Update the links tables and other secondary data
                if ( $content ) {
-                       $recursive = $options['changed']; // bug 50785
+                       $recursive = $options['changed']; // T52785
                        $updates = $content->getSecondaryDataUpdates(
                                $this->getTitle(), null, $recursive, $editInfo->output
                        );
@@ -2363,7 +2298,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( $options['created'] ) {
                        self::onArticleCreate( $this->mTitle );
-               } elseif ( $options['changed'] ) { // bug 50785
+               } elseif ( $options['changed'] ) { // T52785
                        self::onArticleEdit( $this->mTitle, $revision );
                }
 
@@ -2977,7 +2912,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                $dbw->onTransactionPreCommitOrIdle(
                        function () use ( $dbw, $logEntry, $logid ) {
-                               // Bug 56776: avoid deadlocks (especially from FileDeleteForm)
+                               // T58776: avoid deadlocks (especially from FileDeleteForm)
                                $logEntry->publish( $logid );
                        },
                        __METHOD__
@@ -3257,7 +3192,7 @@ class WikiPage implements Page, IDBAccessObject {
                );
 
                // Set patrolling and bot flag on the edits, which gets rollbacked.
-               // This is done even on edit failure to have patrolling in that case (bug 62157).
+               // This is done even on edit failure to have patrolling in that case (T64157).
                $set = [];
                if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
                        // Mark all reverted edits as bot
@@ -3716,4 +3651,15 @@ class WikiPage implements Page, IDBAccessObject {
        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 395cee5..4694890 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Pager
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * IndexPager is an efficient pager which uses a (roughly unique) index in the
  * data set to implement paging, rather than a "LIMIT offset,limit" clause.
@@ -195,7 +197,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         */
        public function doQuery() {
                # Use the child class name for profiling
-               $fname = __METHOD__ . ' (' . get_class( $this ) . ')';
+               $fname = __METHOD__ . ' (' . static::class . ')';
                $section = Profiler::instance()->scopedProfileIn( $fname );
 
                // @todo This should probably compare to DIR_DESCENDING and DIR_ASCENDING constants
@@ -346,7 +348,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         * @return string
         */
        function getSqlComment() {
-               return get_class( $this );
+               return static::class;
        }
 
        /**
index 6f325c9..76f3470 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Pager
  */
+use Wikimedia\Timestamp\TimestampException;
 
 /**
  * IndexPager with a formatted navigation bar
index cbacd34..2023d13 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.
@@ -298,7 +299,7 @@ class BlockLevelPass {
 
                                if ( $openMatch || $closeMatch ) {
                                        $pendingPTag = false;
-                                       # @todo bug 5718: paragraph closed
+                                       # @todo T7718: paragraph closed
                                        $output .= $this->closeParagraph();
                                        if ( $preOpenMatch && !$preCloseMatch ) {
                                                $this->inPre = true;
@@ -352,7 +353,7 @@ class BlockLevelPass {
                                        }
                                }
                        }
-                       # somewhere above we forget to get out of pre block (bug 785)
+                       # somewhere above we forget to get out of pre block (T2785)
                        if ( $preCloseMatch && $this->inPre ) {
                                $this->inPre = false;
                        }
@@ -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 6aa3acc..e34d10b 100644 (file)
@@ -157,7 +157,7 @@ class CoreParserFunctions {
        }
 
        /**
-        * urlencodes a string according to one of three patterns: (bug 22474)
+        * urlencodes a string according to one of three patterns: (T24474)
         *
         * By default (for HTTP "query" strings), spaces are encoded as '+'.
         * Or to encode a value for the HTTP "path", spaces are encoded as '%20'.
index 40da368..605a873 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;
@@ -101,7 +107,7 @@ class DateFormatter {
                $this->targets[self::ISO2] = '[[y-m-d]]';
 
                # Rules
-               #            pref    source       target
+               #            pref       source      target
                $this->rules[self::DMY][self::MD] = self::DM;
                $this->rules[self::ALL][self::MD] = self::MD;
                $this->rules[self::MDY][self::DM] = self::MD;
@@ -121,7 +127,7 @@ class DateFormatter {
         * Get a DateFormatter object
         *
         * @param Language|string|null $lang In which language to format the date
-        *              Defaults to the site content language
+        *     Defaults to the site content language
         * @return DateFormatter
         */
        public static function getInstance( $lang = null ) {
@@ -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 157946c..8db1fe3 100644 (file)
@@ -89,13 +89,15 @@ class Parser {
        # Everything except bracket, space, or control characters
        # \p{Zs} is unicode 'separator, space' category. It covers the space 0x20
        # as well as U+3000 is IDEOGRAPHIC SPACE for T21052
-       const EXT_LINK_URL_CLASS = '[^][<>"\\x00-\\x20\\x7F\p{Zs}]';
+       # \x{FFFD} is the Unicode replacement character, which Preprocessor_DOM
+       # uses to replace invalid HTML characters.
+       const EXT_LINK_URL_CLASS = '[^][<>"\\x00-\\x20\\x7F\p{Zs}\x{FFFD}]';
        # Simplified expression to match an IPv4 or IPv6 address, or
        # at least one character of a host name (embeds EXT_LINK_URL_CLASS)
-       const EXT_LINK_ADDR = '(?:[0-9.]+|\\[(?i:[0-9a-f:.]+)\\]|[^][<>"\\x00-\\x20\\x7F\p{Zs}])';
+       const EXT_LINK_ADDR = '(?:[0-9.]+|\\[(?i:[0-9a-f:.]+)\\]|[^][<>"\\x00-\\x20\\x7F\p{Zs}\x{FFFD}])';
        # RegExp to make image URLs (embeds IPv6 part of EXT_LINK_ADDR)
        // @codingStandardsIgnoreStart Generic.Files.LineLength
-       const EXT_IMAGE_REGEX = '/^(http:\/\/|https:\/\/)((?:\\[(?i:[0-9a-f:.]+)\\])?[^][<>"\\x00-\\x20\\x7F\p{Zs}]+)
+       const EXT_IMAGE_REGEX = '/^(http:\/\/|https:\/\/)((?:\\[(?i:[0-9a-f:.]+)\\])?[^][<>"\\x00-\\x20\\x7F\p{Zs}\x{FFFD}]+)
                \\/([A-Za-z0-9_.,~%\\-+&;#*?!=()@\\x80-\\xFF]+)\\.((?i)gif|png|jpg|jpeg)$/Sxu';
        // @codingStandardsIgnoreEnd
 
@@ -264,7 +266,7 @@ class Parser {
                $this->mUrlProtocols = wfUrlProtocols();
                $this->mExtLinkBracketedRegex = '/\[(((?i)' . $this->mUrlProtocols . ')' .
                        self::EXT_LINK_ADDR .
-                       self::EXT_LINK_URL_CLASS . '*)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
+                       self::EXT_LINK_URL_CLASS . '*)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F\\x{FFFD}]*?)\]/Su';
                if ( isset( $conf['preprocessorClass'] ) ) {
                        $this->mPreprocessorClass = $conf['preprocessorClass'];
                } elseif ( defined( 'HPHP_VERSION' ) ) {
@@ -330,7 +332,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 ] );
        }
 
        /**
@@ -381,7 +385,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 ] );
        }
 
        /**
@@ -413,6 +419,8 @@ class Parser {
                        $text = strtr( $text, "\x7f", "?" );
                        $magicScopeVariable = $this->lock();
                }
+               // Strip U+0000 NULL (T159174)
+               $text = str_replace( "\000", '', $text );
 
                $this->startParse( $title, $options, self::OT_HTML, $clearState );
 
@@ -435,11 +443,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 );
 
@@ -615,8 +625,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;
        }
@@ -663,8 +675,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;
@@ -1259,8 +1273,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;
                }
 
@@ -1280,16 +1297,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
@@ -1328,8 +1345,11 @@ 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
@@ -1368,7 +1388,7 @@ class Parser {
                $text = $this->mStripState->unstripNoWiki( $text );
 
                if ( $isMain ) {
-                       Hooks::run( 'ParserBeforeTidy', [ &$this, &$text ] );
+                       Hooks::run( 'ParserBeforeTidy', [ &$parser, &$text ] );
                }
 
                $text = $this->replaceTransparentTags( $text );
@@ -1409,7 +1429,7 @@ class Parser {
                }
 
                if ( $isMain ) {
-                       Hooks::run( 'ParserAfterTidy', [ &$this, &$text ] );
+                       Hooks::run( 'ParserAfterTidy', [ &$parser, &$text ] );
                }
 
                return $text;
@@ -1434,20 +1454,21 @@ class Parser {
                $spdash = "(?:-|$space)"; # a dash or a non-newline space
                $spaces = "$space++"; # possessive match of 1 or more spaces
                $text = preg_replace_callback(
-                       '!(?:                            # Start cases
-                               (<a[ \t\r\n>].*?</a>) |      # m[1]: Skip link text
-                               (<.*?>) |                    # m[2]: Skip stuff inside
-                                                            #       HTML elements' . "
-                               (\b(?i:$prots)($addr$urlChar*)) | # m[3]: Free external links
-                                                            # m[4]: Post-protocol path
-                               \b(?:RFC|PMID) $spaces       # m[5]: RFC or PMID, capture number
+                       '!(?:                        # Start cases
+                               (<a[ \t\r\n>].*?</a>) |    # m[1]: Skip link text
+                               (<.*?>) |                  # m[2]: Skip stuff inside HTML elements' . "
+                               (\b                        # m[3]: Free external links
+                                       (?i:$prots)
+                                       ($addr$urlChar*)         # m[4]: Post-protocol path
+                               ) |
+                               \b(?:RFC|PMID) $spaces     # m[5]: RFC or PMID, capture number
                                        ([0-9]+)\b |
-                               \bISBN $spaces (             # m[6]: ISBN, capture number
+                               \bISBN $spaces (           # m[6]: ISBN, capture number
                                        (?: 97[89] $spdash? )?   #  optional 13-digit ISBN prefix
                                        (?: [0-9]  $spdash? ){9} #  9 digits with opt. delimiters
                                        [0-9Xx]                  #  check digit
                                )\b
-                       )!xu", [ &$this, 'magicLinkCallback' ], $text );
+                       )!xu", [ $this, 'magicLinkCallback' ], $text );
                return $text;
        }
 
@@ -1947,18 +1968,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
         *
@@ -2213,7 +2222,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
@@ -2479,7 +2488,7 @@ class Parser {
         *
         * @private
         *
-        * @param int $index
+        * @param string $index Magic variable identifier as mapped in MagicWord::$mVariableIDs
         * @param bool|PPFrame $frame
         *
         * @throws MWException
@@ -2498,18 +2507,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();
 
@@ -2812,6 +2824,9 @@ class Parser {
                        case 'contentlanguage':
                                global $wgLanguageCode;
                                return $wgLanguageCode;
+                       case 'pagelanguage':
+                               $value = $pageLang->getCode();
+                               break;
                        case 'cascadingsources':
                                $value = CoreParserFunctions::cascadingsources( $this );
                                break;
@@ -2819,7 +2834,7 @@ class Parser {
                                $ret = null;
                                Hooks::run(
                                        'ParserGetVariableValueSwitch',
-                                       [ &$this, &$this->mVarCache, &$index, &$ret, &$frame ]
+                                       [ &$parser, &$this->mVarCache, &$index, &$ret, &$frame ]
                                );
 
                                return $ret;
@@ -3363,7 +3378,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 = [];
@@ -3872,7 +3890,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>';
@@ -4447,6 +4467,9 @@ class Parser {
                $this->startParse( $title, $options, self::OT_WIKI, $clearState );
                $this->setUser( $user );
 
+               // Strip U+0000 NULL (T159174)
+               $text = str_replace( "\000", '', $text );
+
                // We still normalize line endings for backwards-compatibility
                // with other code that just calls PST, but this should already
                // be handled in TextContent subclasses
@@ -4975,7 +4998,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 ) {
index 9e96540..f76c0b5 100644 (file)
@@ -223,7 +223,7 @@ class ParserCache {
 
                // The edit section preference may not be the appropiate one in
                // the ParserOutput, as we are not storing it in the parsercache
-               // key. Force it here. See bug 31445.
+               // key. Force it here. See T33445.
                $value->setEditSectionTokens( $popts->getEditSection() );
 
                $wikiPage = method_exists( $article, 'getPage' )
index 2900f41..7be8281 100644 (file)
@@ -409,7 +409,7 @@ class ParserOptions {
         * when the page is rendered based on the language of the user.
         *
         * @note When saving, this will return the default language instead of the user's.
-        * {{int: }} uses this which used to produce inconsistent link tables (bug 14404).
+        * {{int: }} uses this which used to produce inconsistent link tables (T16404).
         *
         * @return Language
         * @since 1.19
index 7bf848f..b2f99b3 100644 (file)
@@ -696,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
@@ -707,7 +709,7 @@ class ParserOutput extends CacheTime {
                        return false;
                }
 
-               // Important to parse with correct title (bug 31469)
+               // Important to parse with correct title (T33469)
                $cat = wfMessage( $msg )
                        ->title( $title )
                        ->inContentLanguage()
index 661318b..b93c617 100644 (file)
@@ -134,7 +134,7 @@ class Preprocessor_DOM extends Preprocessor {
         *                                is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
-        * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
+        * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of T6899.
         *
         * Any flag added to the $flags parameter here, or any other parameter liable to cause a
         * change in the DOM tree for a given text, must be passed through the section identifier
index 2666c93..b2e9531 100644 (file)
@@ -107,7 +107,7 @@ class Preprocessor_Hash extends Preprocessor {
         *                                 included. Default is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
-        * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
+        * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of T6899.
         *
         * Any flag added to the $flags parameter here, or any other parameter liable to cause a
         * change in the DOM tree for a given text, must be passed through the section identifier
index 534e86b..1f1add7 100644 (file)
@@ -129,7 +129,7 @@ class PoolWorkArticleView extends PoolCounterWork {
                        return false;
                }
 
-               // Reduce effects of race conditions for slow parses (bug 46014)
+               // Reduce effects of race conditions for slow parses (T48014)
                $cacheTime = wfTimestampNow();
 
                $time = - microtime( true );
index 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 088721c..264ec0c 100644 (file)
@@ -41,7 +41,7 @@ class ProfilerOutputDb extends ProfilerOutput {
        }
 
        public function canUse() {
-               # Do not log anything if database is readonly (bug 5375)
+               # Do not log anything if database is readonly (T7375)
                return !wfReadOnly();
        }
 
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
         */
index c5b2150..344dd8f 100644 (file)
@@ -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
         *
@@ -90,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
         */
@@ -144,12 +129,19 @@ class ExtensionRegistry {
                        '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 {
@@ -159,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 = [];
        }
index a4100bb..210deb1 100644 (file)
@@ -23,11 +23,11 @@ interface Processor {
 
        /**
         * @return array With following keys:
-        *              'globals' - variables to be set to $GLOBALS
-        *              'defines' - constants to define
-        *              'callbacks' - functions to be executed by the registry
-        *              'credits' - metadata to be stored by registry
-        *              'attributes' - registration info which isn't a global variable
+        *     'globals' - variables to be set to $GLOBALS
+        *     'defines' - constants to define
+        *     'callbacks' - functions to be executed by the registry
+        *     'credits' - metadata to be stored by registry
+        *     'attributes' - registration info which isn't a global variable
         */
        public function getExtractedInfo();
 
index 5aaaa1b..a31551c 100644 (file)
@@ -87,17 +87,17 @@ class VersionChecker {
         * installed extensions in the $credits array.
         *
         * Example $extDependencies:
-        *      {
-        *              'FooBar' => {
-        *                      'MediaWiki' => '>= 1.25.0',
-        *                      'extensions' => {
-        *                              'FooBaz' => '>= 1.25.0'
-        *                      },
-        *                      'skins' => {
-        *                              'BazBar' => '>= 1.0.0'
-        *                      }
-        *              }
-        *      }
+        *     {
+        *       'FooBar' => {
+        *         'MediaWiki' => '>= 1.25.0',
+        *         'extensions' => {
+        *           'FooBaz' => '>= 1.25.0'
+        *         },
+        *         'skins' => {
+        *           'BazBar' => '>= 1.0.0'
+        *         }
+        *       }
+        *     }
         *
         * @param array $extDependencies All extensions that depend on other ones
         * @return array
index f0b48d5..717fb45 100644 (file)
@@ -255,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();
@@ -404,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.
@@ -709,7 +714,7 @@ class ResourceLoader implements LoggerAwareInterface {
                        $module = $this->getModule( $name );
                        if ( $module ) {
                                // Do not allow private modules to be loaded from the web.
-                               // This is a security issue, see bug 34907.
+                               // This is a security issue, see T36907.
                                if ( $module->getGroup() === 'private' ) {
                                        $this->logger->debug( "Request for private module '$name' denied" );
                                        $this->errors[] = "Cannot show private module \"$name\"";
@@ -813,6 +818,7 @@ class ResourceLoader implements LoggerAwareInterface {
         * @return void
         */
        protected function sendResponseHeaders( ResourceLoaderContext $context, $etag, $errors ) {
+               \MediaWiki\HeaderCallback::warnIfHeadersSent();
                $rlMaxage = $this->config->get( 'ResourceLoaderMaxage' );
                // Use a short cache expiry so that updates propagate to clients quickly, if:
                // - No version specified (shared resources, e.g. stylesheets)
@@ -1211,7 +1217,7 @@ MESSAGE;
                        $styles = (array)$styles;
                        foreach ( $styles as $style ) {
                                $style = trim( $style );
-                               // Don't output an empty "@media print { }" block (bug 40498)
+                               // Don't output an empty "@media print { }" block (T42498)
                                if ( $style !== '' ) {
                                        // Transform the media type based on request params and config
                                        // The way that this relies on $wgRequest to propagate request params is slightly evil
@@ -1628,7 +1634,7 @@ MESSAGE;
         */
        public function getLessCompiler( $extraVars = [] ) {
                // When called from the installer, it is possible that a required PHP extension
-               // is missing (at least for now; see bug 47564). If this is the case, throw an
+               // is missing (at least for now; see T49564). If this is the case, throw an
                // exception (caught by the installer) to prevent a fatal error later on.
                if ( !class_exists( 'Less_Parser' ) ) {
                        throw new MWException( 'MediaWiki requires the less.php parser' );
index ef2827c..8c792ad 100644 (file)
@@ -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 ) {
@@ -415,7 +417,7 @@ class ResourceLoaderClientHtml {
                                // Special handling for the user group; because users might change their stuff
                                // on-wiki like user pages, or user preferences; we need to find the highest
                                // timestamp of these user-changeable modules so we can ensure cache misses on change
-                               // This should NOT be done for the site group (bug 27564) because anons get that too
+                               // This should NOT be done for the site group (T29564) because anons get that too
                                // and we shouldn't be putting timestamps in CDN-cached HTML
                                if ( $group === 'user' ) {
                                        // Must setModules() before makeVersionQuery()
index a1a89cb..8955b8c 100644 (file)
@@ -197,7 +197,7 @@ class ResourceLoaderContext {
                if ( $this->direction === null ) {
                        $this->direction = $this->getRequest()->getRawVal( 'dir' );
                        if ( !$this->direction ) {
-                               // Determine directionality based on user language (bug 6100)
+                               // Determine directionality based on user language (T8100)
                                $this->direction = Language::factory( $this->getLanguage() )->getDir();
                        }
                }
index 8124f33..a2b4b1d 100644 (file)
@@ -461,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,
                                        ]
                                );
 
@@ -633,7 +651,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                                        && substr( rtrim( $scripts ), -1 ) !== ';'
                                ) {
                                        // Append semicolon to prevent weird bugs caused by files not
-                                       // terminating their statements right (bug 27054)
+                                       // terminating their statements right (T29054)
                                        $scripts .= ";\n";
                                }
                        }
@@ -644,7 +662,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                if ( $context->shouldIncludeStyles() ) {
                        $styles = [];
                        // Don't create empty stylesheets like [ '' => '' ] for modules
-                       // that don't *have* any stylesheets (bug 38024).
+                       // that don't *have* any stylesheets (T40024).
                        $stylePairs = $this->getStyles( $context );
                        if ( count( $stylePairs ) ) {
                                // If we are in debug mode without &only= set, we'll want to return an array of URLs
@@ -825,7 +843,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         */
        public function getDefinitionSummary( ResourceLoaderContext $context ) {
                return [
-                       '_class' => get_class( $this ),
+                       '_class' => static::class,
                        '_cacheEpoch' => $this->getConfig()->get( 'CacheEpoch' ),
                ];
        }
index a99305c..48e4a0d 100644 (file)
@@ -82,7 +82,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgSearchType' => $conf->get( 'SearchType' ),
                        'wgVariantArticlePath' => $conf->get( 'VariantArticlePath' ),
                        // Force object to avoid "empty" associative array from
-                       // becoming [] instead of {} in JS (bug 34604)
+                       // becoming [] instead of {} in JS (T36604)
                        'wgActionPaths' => (object)$conf->get( 'ActionPaths' ),
                        'wgServer' => $conf->get( 'Server' ),
                        'wgServerName' => $conf->get( 'ServerName' ),
index 14d6e05..b0d060b 100644 (file)
@@ -268,7 +268,7 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        return true;
                }
 
-               // Bug 68488: For other modules (i.e. ones that are called in cached html output) only check
+               // T70488: For other modules (i.e. ones that are called in cached html output) only check
                // page existance. This ensures that, if some pages in a module are temporarily blanked,
                // we don't end omit the module's script or link tag on some pages.
                return count( $revisions ) === 0;
@@ -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 833e38b..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
@@ -255,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;
                }
 
index f0b1907..453c6cc 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\FakeResultWrapper;
+
 /**
  * List for revision table items
  *
index 0bcb07a..9817b6c 100644 (file)
@@ -109,6 +109,20 @@ abstract class SearchEngine {
                $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.
@@ -706,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 8a06b65..910fd77 100644 (file)
@@ -93,7 +93,7 @@ abstract class SearchIndexFieldDefinition implements SearchIndexField {
        public function merge( SearchIndexField $that ) {
                // TODO: which definitions may be compatible?
                if ( ( $that instanceof self ) && $this->type === $that->type &&
-                    $this->flags === $that->flags && $this->type !== self::INDEX_TYPE_NESTED
+                       $this->flags === $that->flags && $this->type !== self::INDEX_TYPE_NESTED
                ) {
                        return $that;
                }
index c3985d1..53d09e8 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * This class is used for different SQL-based search engines shipped with MediaWiki
  * @ingroup Search
index 0041450..7cc8509 100644 (file)
@@ -773,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 3ab0f43..c6990fe 100644 (file)
@@ -91,9 +91,9 @@ interface SessionManagerInterface extends LoggerAwareInterface {
         *
         * The return value is such that someone could theoretically do this:
         * @code
-        *  foreach ( $provider->getVaryHeaders() as $header => $options ) {
-        *      $outputPage->addVaryHeader( $header, $options );
-        *  }
+        * foreach ( $provider->getVaryHeaders() as $header => $options ) {
+        *   $outputPage->addVaryHeader( $header, $options );
+        * }
         * @endcode
         *
         * @return array
index 61c7500..3cf69b7 100644 (file)
@@ -397,9 +397,9 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI
         *
         * The return value is such that someone could theoretically do this:
         * @code
-        *  foreach ( $provider->getVaryHeaders() as $header => $options ) {
-        *      $outputPage->addVaryHeader( $header, $options );
-        *  }
+        * foreach ( $provider->getVaryHeaders() as $header => $options ) {
+        *   $outputPage->addVaryHeader( $header, $options );
+        * }
         * @endcode
         *
         * @protected For use by \MediaWiki\Session\SessionManager only
@@ -455,7 +455,7 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI
         * @return string
         */
        public function __toString() {
-               return get_class( $this );
+               return static::class;
        }
 
        /**
@@ -475,7 +475,7 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI
         */
        protected function describeMessage() {
                return wfMessage(
-                       'sessionprovider-' . str_replace( '\\', '-', strtolower( get_class( $this ) ) )
+                       'sessionprovider-' . str_replace( '\\', '-', strtolower( static::class ) )
                );
        }
 
index 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 6a97a50..28f19f9 100644 (file)
@@ -463,6 +463,9 @@ class Site implements Serializable {
         * @param string $languageCode
         */
        public function setLanguageCode( $languageCode ) {
+               if ( !Language::isValidCode( $languageCode ) ) {
+                       throw new InvalidArgumentException( "$languageCode is not a valid language code." );
+               }
                $this->languageCode = $languageCode;
        }
 
index 65eb9b7..e571c58 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 ) ) {
@@ -320,12 +324,12 @@ abstract class BaseTemplate extends QuickTemplate {
         *
         * If a "data" key is present, it must be an array, where the keys represent
         * the data-xxx properties with their provided values. For example,
-        *  $item['data'] = [
-        *       'foo' => 1,
-        *       'bar' => 'baz',
-        *  ];
+        *     $item['data'] = [
+        *       'foo' => 1,
+        *       'bar' => 'baz',
+        *     ];
         * will render as element properties:
-        *  data-foo='1' data-bar='baz'
+        *     data-foo='1' data-bar='baz'
         *
         * @param array $options Can be used to affect the output of a link.
         * Possible options are:
@@ -644,7 +648,7 @@ abstract class BaseTemplate extends QuickTemplate {
         * @since 1.25
         */
        public function getIndicators() {
-               $out = "<div class=\"mw-indicators\">\n";
+               $out = "<div class=\"mw-indicators mw-body-content\">\n";
                foreach ( $this->data['indicators'] as $id => $content ) {
                        $out .= Html::rawElement(
                                'div',
index 96812ea..3ef646a 100644 (file)
@@ -381,7 +381,7 @@ abstract class Skin extends ContextSource {
 
                if ( $title->isSpecialPage() ) {
                        $type = 'ns-special';
-                       // bug 23315: provide a class based on the canonical special page name without subpages
+                       // T25315: provide a class based on the canonical special page name without subpages
                        list( $canonicalName ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
                        if ( $canonicalName ) {
                                $type .= ' ' . Sanitizer::escapeClass( "mw-special-$canonicalName" );
@@ -906,7 +906,10 @@ abstract class Skin extends ContextSource {
                                $html = htmlspecialchars( $icon["alt"] );
                        }
                        if ( $url ) {
-                               $html = Html::rawElement( 'a', [ "href" => $url ], $html );
+                               global $wgExternalLinkTarget;
+                               $html = Html::rawElement( 'a',
+                                       [ "href" => $url, "target" => $wgExternalLinkTarget ],
+                                       $html );
                        }
                }
                return $html;
@@ -1035,7 +1038,7 @@ abstract class Skin extends ContextSource {
                global $wgStylePath, $wgStyleVersion;
 
                if ( $this->stylename === null ) {
-                       $class = get_class( $this );
+                       $class = static::class;
                        throw new MWException( "$class::\$stylename must be set to use getSkinStylePath()" );
                }
 
@@ -1283,7 +1286,7 @@ abstract class Skin extends ContextSource {
                                        $line = array_map( 'trim', explode( '|', $line, 2 ) );
                                        if ( count( $line ) !== 2 ) {
                                                // Second sanity check, could be hit by people doing
-                                               // funky stuff with parserfuncs... (bug 33321)
+                                               // funky stuff with parserfuncs... (T35321)
                                                continue;
                                        }
 
@@ -1538,7 +1541,7 @@ abstract class Skin extends ContextSource {
 
                $attribs = [];
                if ( !is_null( $tooltip ) ) {
-                       # Bug 25462: undo double-escaping.
+                       # T27462: undo double-escaping.
                        $tooltip = Sanitizer::decodeCharReferences( $tooltip );
                        $attribs['title'] = wfMessage( 'editsectionhint' )->rawParams( $tooltip )
                                ->inLanguage( $lang )->text();
index 575a9ac..61dbf2b 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',
@@ -344,7 +344,7 @@ class SkinTemplate extends Skin {
                $tpl->set( 'charset', 'UTF-8' );
                $tpl->setRef( 'wgScript', $wgScript );
                $tpl->setRef( 'skinname', $this->skinname );
-               $tpl->set( 'skinclass', get_class( $this ) );
+               $tpl->set( 'skinclass', static::class );
                $tpl->setRef( 'skin', $this );
                $tpl->setRef( 'stylename', $this->stylename );
                $tpl->set( 'printable', $out->isPrintable() );
@@ -582,7 +582,7 @@ class SkinTemplate extends Skin {
                /* set up the default links for the personal toolbar */
                $personal_urls = [];
 
-               # Due to bug 32276, if a user does not have read permissions,
+               # Due to T34276, if a user does not have read permissions,
                # $this->getTitle() will just give Special:Badtitle, which is
                # not especially useful as a returnto parameter. Use the title
                # from the request instead, if there was one.
@@ -663,7 +663,7 @@ class SkinTemplate extends Skin {
                                        'text' => $this->msg( 'pt-userlogout' )->text(),
                                        'href' => self::makeSpecialUrl( 'Userlogout',
                                                // userlogout link must always contain an & character, otherwise we might not be able
-                                               // to detect a buggy precaching proxy (bug 17790)
+                                               // to detect a buggy precaching proxy (T19790)
                                                $title->isSpecial( 'Preferences' ) ? 'noreturnto' : $returnto ),
                                        'active' => false
                                ];
@@ -1120,7 +1120,7 @@ class SkinTemplate extends Skin {
                        $content_navigation['namespaces']['special'] = [
                                'class' => 'selected',
                                'text' => $this->msg( 'nstab-special' )->text(),
-                               'href' => $request->getRequestURL(), // @see: bug 2457, bug 2510
+                               'href' => $request->getRequestURL(), // @see: T4457, T4510
                                'context' => 'subject'
                        ];
 
@@ -1283,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()
                                ];
@@ -1322,11 +1322,11 @@ class SkinTemplate extends Skin {
                        if ( !$user->isAnon() ) {
                                $sur = new UserrightsPage;
                                $sur->setContext( $this->getContext() );
-                               $canChange = $sur->userCanChangeRights( $this->getUser(), false );
+                               $canChange = $sur->userCanChangeRights( $user );
                                $nav_urls['userrights'] = [
                                        'text' => $this->msg(
                                                $canChange ? 'tool-link-userrights' : 'tool-link-userrights-readonly',
-                                               $this->getUser()->getName()
+                                               $rootUser
                                        )->text(),
                                        'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
                                ];
index 00efeae..f62b302 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  * @ingroup SpecialPage
  */
+use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * Special page which uses a ChangesList to show query results.
@@ -77,6 +79,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' )
+                       ) );
+               }
        }
 
        /**
@@ -302,7 +312,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        $operator = $opts['invert'] ? '!=' : '=';
                        $boolean = $opts['invert'] ? 'AND' : 'OR';
 
-                       // Namespace association (bug 2429)
+                       // Namespace association (T4429)
                        if ( !$opts['associated'] ) {
                                $condition = "rc_namespace $operator $selectedNS";
                        } else {
index c4e53ee..bafee65 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Variant of QueryPage which uses a gallery to output results, thus
  * suited for reports generating images
index c3ee321..5c048a2 100644 (file)
@@ -177,7 +177,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
 
                # 1. When switching accounts, it sucks to get automatically logged out
                # 2. Do not return to PasswordReset after a successful password change
-               #    but goto Wiki start page (Main_Page) instead ( bug 33997 )
+               #    but goto Wiki start page (Main_Page) instead ( T35997 )
                $returnToTitle = Title::newFromText( $this->mReturnTo );
                if ( is_object( $returnToTitle )
                        && ( $returnToTitle->isSpecial( 'Userlogout' )
@@ -702,7 +702,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
         */
        protected function getFakeTemplate( $msg, $msgType ) {
                global $wgAuth, $wgEnableEmail, $wgHiddenPrefs, $wgEmailConfirmToEdit, $wgEnableUserEmail,
-                          $wgSecureLogin, $wgPasswordResetRoutes;
+                       $wgSecureLogin, $wgPasswordResetRoutes;
 
                // make a best effort to get the value of fields which used to be fixed in the old login
                // template but now might or might not exist depending on what providers are used
@@ -727,7 +727,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $user = $this->getUser();
                $template = new FakeAuthTemplate();
 
-               // Pre-fill username (if not creating an account, bug 44775).
+               // Pre-fill username (if not creating an account, T46775).
                if ( $data->mUsername == '' && $this->isSignup() ) {
                        if ( $user->isLoggedIn() ) {
                                $data->mUsername = $user->getName();
@@ -772,7 +772,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $resetLink = $this->isSignup()
                        ? null
                        : is_array( $wgPasswordResetRoutes )
-                         && in_array( true, array_values( $wgPasswordResetRoutes ), true );
+                               && in_array( true, array_values( $wgPasswordResetRoutes ), true );
 
                $template->set( 'header', '' );
                $template->set( 'formheader', '' );
index 3bb3f85..45cef2b 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Variant of QueryPage which formats the result as a simple link to the page
  *
index 3592500..65e82e8 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * This is a class for doing query pages; since they're almost all the same,
  * we factor out some of the functionality into a superclass, and let
@@ -302,7 +304,7 @@ abstract class QueryPage extends SpecialPage {
                        return 0;
                }
 
-               $fname = get_class( $this ) . '::recache';
+               $fname = static::class . '::recache';
                $dbw = wfGetDB( DB_MASTER );
                if ( !$dbw ) {
                        return false;
@@ -322,7 +324,7 @@ abstract class QueryPage extends SpecialPage {
                                                        $value = wfTimestamp( TS_UNIX,
                                                                $row->value );
                                                } else {
-                                                       $value = intval( $row->value ); // @bug 14414
+                                                       $value = intval( $row->value ); // T16414
                                                }
                                        } else {
                                                $value = 0;
@@ -387,7 +389,7 @@ abstract class QueryPage extends SpecialPage {
         * @since 1.18
         */
        public function reallyDoQuery( $limit, $offset = false ) {
-               $fname = get_class( $this ) . "::reallyDoQuery";
+               $fname = static::class . '::reallyDoQuery';
                $dbr = $this->getRecacheDB();
                $query = $this->getQueryInfo();
                $order = $this->getOrderFields();
@@ -478,7 +480,7 @@ abstract class QueryPage extends SpecialPage {
        public function getCachedTimestamp() {
                if ( is_null( $this->cachedTimestamp ) ) {
                        $dbr = wfGetDB( DB_REPLICA );
-                       $fname = get_class( $this ) . '::getCachedTimestamp';
+                       $fname = static::class . '::getCachedTimestamp';
                        $this->cachedTimestamp = $dbr->selectField( 'querycache_info', 'qci_timestamp',
                                [ 'qci_type' => $this->getName() ], $fname );
                }
index ea7d783..b1ddacf 100644 (file)
@@ -52,7 +52,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
 
                        return $redirect;
                } else {
-                       $class = get_class( $this );
+                       $class = static::class;
                        throw new MWException( "RedirectSpecialPage $class doesn't redirect!" );
                }
        }
index daabded..33e1cc3 100644 (file)
@@ -346,7 +346,7 @@ class SpecialPageFactory {
                        return [ null, null ];
                }
 
-               if ( !isset( $bits[1] ) ) { // bug 2087
+               if ( !isset( $bits[1] ) ) { // T4087
                        $par = null;
                } else {
                        $par = $bits[1];
@@ -512,7 +512,7 @@ class SpecialPageFactory {
                // @todo FIXME: Redirects broken due to this call
                $bits = explode( '/', $title->getDBkey(), 2 );
                $name = $bits[0];
-               if ( !isset( $bits[1] ) ) { // bug 2087
+               if ( !isset( $bits[1] ) ) { // T4087
                        $par = null;
                } else {
                        $par = $bits[1];
index 00fca12..9d92cbd 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Class definition for a wanted query page like
  * WantedPages, WantedTemplates, etc
index a01e9b2..e7030c5 100644 (file)
@@ -86,7 +86,7 @@ class SpecialActiveUsers extends SpecialPage {
                $groups = User::getAllGroups();
 
                foreach ( $groups as $group ) {
-                       $msg = htmlspecialchars( User::getGroupName( $group ) );
+                       $msg = htmlspecialchars( UserGroupMembership::getGroupName( $group ) );
                        $options[$msg] = $group;
                }
 
index 585f70b..04c04b2 100644 (file)
@@ -64,7 +64,7 @@ class SpecialBlock extends FormSpecialPage {
        protected function checkExecutePermissions( User $user ) {
                parent::checkExecutePermissions( $user );
 
-               # bug 15810: blocked admins should have limited access here
+               # T17810: blocked admins should have limited access here
                $status = self::checkUnblockSelf( $this->target, $user );
                if ( $status !== true ) {
                        throw new ErrorPageError( 'badaccess', $status );
@@ -275,7 +275,7 @@ class SpecialBlock extends FormSpecialPage {
                        }
 
                        // If the username was hidden (ipb_deleted == 1), don't show the reason
-                       // unless this user also has rights to hideuser: Bug 35839
+                       // unless this user also has rights to hideuser: T37839
                        if ( !$block->mHideName || $this->getUser()->isAllowed( 'hideuser' ) ) {
                                $fields['Reason']['default'] = $block->mReason;
                        } else {
@@ -744,7 +744,7 @@ class SpecialBlock extends FormSpecialPage {
                        $blockNotConfirmed = !$data['Confirm'] || ( array_key_exists( 'PreviousTarget', $data )
                                && $data['PreviousTarget'] !== $target );
 
-                       # Special case for API - bug 32434
+                       # Special case for API - T34434
                        $reblockNotAllowed = ( array_key_exists( 'Reblock', $data ) && !$data['Reblock'] );
 
                        # Show form unless the user is already aware of this...
@@ -824,13 +824,17 @@ class SpecialBlock extends FormSpecialPage {
                $logEntry->setComment( $data['Reason'][0] );
                $logEntry->setPerformer( $performer );
                $logEntry->setParameters( $logParams );
-               # Relate log ID to block IDs (bug 25763)
+               # Relate log ID to block IDs (T27763)
                $blockIds = array_merge( [ $status['id'] ], $status['autoIds'] );
                $logEntry->setRelations( [ 'ipb_id' => $blockIds ] );
                $logId = $logEntry->insert();
+
+               if ( !empty( $data['Tags'] ) ) {
+                       $logEntry->setTags( $data['Tags'] );
+               }
+
                $logEntry->publish( $logId );
 
-               # Report to the user
                return true;
        }
 
@@ -898,7 +902,7 @@ class SpecialBlock extends FormSpecialPage {
        }
 
        /**
-        * bug 15810: blocked admins should not be able to block/unblock
+        * T17810: blocked admins should not be able to block/unblock
         * others, and probably shouldn't be able to unblock themselves
         * either.
         * @param User|int|string $user
index b730ecd..9aba41e 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page listing redirects to non existent page. Those should be
  * fixed to point to an existing page.
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 f22d5f3..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() ) {
index 40277ca..1028002 100644 (file)
@@ -359,7 +359,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                [ 'page' => $userpage->getPrefixedText() ]
                        );
 
-                       # Suppression log link (bug 59120)
+                       # Suppression log link (T61120)
                        if ( $sp->getUser()->isAllowed( 'suppressionlog' ) ) {
                                $tools['log-suppression'] = $linkRenderer->makeKnownLink(
                                        SpecialPage::getTitleFor( 'Log', 'suppress' ),
@@ -529,7 +529,6 @@ class SpecialContributions extends IncludableSpecialPage {
                        'text',
                        [
                                'size' => '40',
-                               'required' => '',
                                'class' => [
                                        'mw-input',
                                        'mw-ui-input-inline',
index 9140bf1..59351dc 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page listing redirects to redirecting page.
  * The software will automatically not follow double redirects, to prevent loops.
@@ -75,7 +77,7 @@ class DoubleRedirectsPage extends QueryPage {
                        'conds' => [
                                'ra.rd_from = pa.page_id',
 
-                               // Filter out redirects where the target goes interwiki (bug 40353).
+                               // Filter out redirects where the target goes interwiki (T42353).
                                // This isn't an optimization, it is required for correct results,
                                // otherwise a non-double redirect like Bar -> w:Foo will show up
                                // like "Bar -> Foo -> w:Foo".
index 347f0c0..e1ecfe8 100644 (file)
@@ -629,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' ]
                        );
@@ -793,7 +793,7 @@ class EditWatchlistCheckboxSeriesField extends HTMLMultiSelectField {
         * HTMLMultiSelectField throws validation errors if we get input data
         * that doesn't match the data set in the form setup. This causes
         * problems if something gets removed from the watchlist while the
-        * form is open (bug 32126), but we know that invalid items will
+        * form is open (T34126), but we know that invalid items will
         * be harmless so we can override it here.
         *
         * @param string $value The value the field was submitted with
index ca0d139..560d75a 100644 (file)
@@ -263,7 +263,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        $user = $this->getUser();
 
                        // To prevent cross-site scripting attacks, don't show the preview if raw HTML is
-                       // allowed and a valid edit token is not provided (bug 71111). However, MediaWiki
+                       // allowed and a valid edit token is not provided (T73111). However, MediaWiki
                        // does not currently provide logged-out users with CSRF protection; in that case,
                        // do not show the preview unless anonymous editing is allowed.
                        if ( $user->isAnon() && !$user->isAllowed( 'edit' ) ) {
index bf535a6..f5e9e49 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup SpecialPage
  */
 
+use Mediawiki\MediaWikiServices;
+
 /**
  * A special page that allows users to export pages in a XML file
  *
@@ -359,7 +361,7 @@ class SpecialExport extends SpecialPage {
 
                        $pages = array_keys( $pageSet );
 
-                       // Normalize titles to the same format and remove dupes, see bug 17374
+                       // Normalize titles to the same format and remove dupes, see T19374
                        foreach ( $pages as $k => $v ) {
                                $pages[$k] = str_replace( " ", "_", $v );
                        }
@@ -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;
 
@@ -392,7 +394,7 @@ class SpecialExport extends SpecialPage {
                        $exporter->allPages();
                } else {
                        foreach ( $pages as $page ) {
-                               # Bug 8824: Only export pages the user can read
+                               # T10824: Only export pages the user can read
                                $title = Title::newFromText( $page );
                                if ( is_null( $title ) ) {
                                        // @todo Perhaps output an <error> tag or something.
index ce88624..a2930fc 100644 (file)
@@ -536,6 +536,7 @@ class SpecialImport extends SpecialPage {
  */
 class ImportReporter extends ContextSource {
        private $reason = false;
+       private $logTags = [];
        private $mOriginalLogCallback = null;
        private $mOriginalPageOutCallback = null;
        private $mLogItemCount = 0;
@@ -558,6 +559,16 @@ class ImportReporter extends ContextSource {
                $this->reason = $reason;
        }
 
+       /**
+        * Sets change tags to apply to the import log entry and null revision.
+        *
+        * @param array $tags
+        * @since 1.29
+        */
+       public function setChangeTags( array $tags ) {
+               $this->logTags = $tags;
+       }
+
        function open() {
                $this->getOutput()->addHTML( "<ul>\n" );
        }
@@ -628,14 +639,6 @@ class ImportReporter extends ContextSource {
                                        . $this->reason;
                        }
 
-                       $logEntry = new ManualLogEntry( 'import', $action );
-                       $logEntry->setTarget( $title );
-                       $logEntry->setComment( $this->reason );
-                       $logEntry->setPerformer( $this->getUser() );
-                       $logEntry->setParameters( $logParams );
-                       $logid = $logEntry->insert();
-                       $logEntry->publish( $logid );
-
                        $comment = $detail; // quick
                        $dbw = wfGetDB( DB_MASTER );
                        $latest = $title->getLatestRevID();
@@ -647,8 +650,9 @@ class ImportReporter extends ContextSource {
                                $this->getUser()
                        );
 
+                       $nullRevId = null;
                        if ( !is_null( $nullRevision ) ) {
-                               $nullRevision->insertOn( $dbw );
+                               $nullRevId = $nullRevision->insertOn( $dbw );
                                $page = WikiPage::factory( $title );
                                # Update page record
                                $page->updateRevisionOn( $dbw, $nullRevision );
@@ -657,6 +661,22 @@ class ImportReporter extends ContextSource {
                                        [ $page, $nullRevision, $latest, $this->getUser() ]
                                );
                        }
+
+                       // Create the import log entry
+                       $logEntry = new ManualLogEntry( 'import', $action );
+                       $logEntry->setTarget( $title );
+                       $logEntry->setComment( $this->reason );
+                       $logEntry->setPerformer( $this->getUser() );
+                       $logEntry->setParameters( $logParams );
+                       $logid = $logEntry->insert();
+                       if ( count( $this->logTags ) ) {
+                               $logEntry->setTags( $this->logTags );
+                       }
+                       // Make sure the null revision will be tagged as well
+                       $logEntry->setAssociatedRevId( $nullRevId );
+
+                       $logEntry->publish( $logid );
+
                } else {
                        $this->getOutput()->addHTML( "<li>" . $linkRenderer->makeKnownLink( $title ) . " " .
                                $this->msg( 'import-nonewrevisions' )->escaped() . "</li>\n" );
index 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 a2fa844..a1f5efa 100644 (file)
@@ -22,6 +22,8 @@
  * @author Brion Vibber
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Special:LinkSearch to search the external-links table.
  * @ingroup SpecialPage
index dbe5c2f..52c710d 100644 (file)
@@ -24,6 +24,8 @@
  * @author Brian Wolff
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Special:ListDuplicatedFiles Lists all files where the current version is
  *   a duplicate of the current version of some other file.
index f3d3a77..7a25e55 100644 (file)
@@ -273,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 d034a6c..b2d6a33 100644 (file)
@@ -24,6 +24,8 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Special:Listredirects - Lists all the redirects on the wiki.
  * @ingroup SpecialPage
index 533a331..195d08b 100644 (file)
@@ -96,7 +96,7 @@ class SpecialLog extends SpecialPage {
 
                # Some log types are only for a 'User:' title but we might have been given
                # only the username instead of the full title 'User:username'. This part try
-               # to lookup for a user by that name and eventually fix user input. See bug 1697.
+               # to lookup for a user by that name and eventually fix user input. See T3697.
                if ( in_array( $opts->getValue( 'type' ), self::getLogTypesOnUser() ) ) {
                        # ok we have a type of log which expect a user title.
                        $target = Title::newFromText( $opts->getValue( 'page' ) );
index 15696bc..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,
@@ -127,6 +128,33 @@ class MIMEsearchPage extends QueryPage {
                        ->displayForm( false );
        }
 
+       protected function getSuggestionsForTypes() {
+               $dbr = wfGetDB( DB_REPLICA );
+               $lastMajor = null;
+               $suggestions = [];
+               $result = $dbr->select(
+                       [ 'image' ],
+                       // We ignore img_media_type, but using it in the query is needed for MySQL to choose a
+                       // sensible execution plan
+                       [ 'img_media_type', 'img_major_mime', 'img_minor_mime' ],
+                       [],
+                       __METHOD__,
+                       [ 'GROUP BY' => [ 'img_media_type', 'img_major_mime', 'img_minor_mime' ] ]
+               );
+               foreach ( $result as $row ) {
+                       $major = $row->img_major_mime;
+                       $minor = $row->img_minor_mime;
+                       $suggestions[ "$major/$minor" ] = "$major/$minor";
+                       if ( $lastMajor === $major ) {
+                               // If there are at least two with the same major mime type, also include the wildcard
+                               $suggestions[ "$major/*" ] = "$major/*";
+                       }
+                       $lastMajor = $major;
+               }
+               ksort( $suggestions );
+               return $suggestions;
+       }
+
        public function execute( $par ) {
                $this->mime = $par ? $par : $this->getRequest()->getText( 'mime' );
                $this->mime = trim( $this->mime );
index 1cb6549..a88767a 100644 (file)
@@ -22,6 +22,8 @@
  * @author Brian Wolff
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * @ingroup SpecialPage
  */
index 6095412..0776eec 100644 (file)
@@ -24,6 +24,8 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page that list pages that have highest category count
  *
index 210c4a2..8560dca 100644 (file)
@@ -24,6 +24,8 @@
  * @author Umherirrender
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page that listed pages that have highest interwiki count
  *
index 712574c..ff8550d 100644 (file)
@@ -25,6 +25,8 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page to show pages ordered by the number of pages linking to them.
  *
index 41678cb..699940b 100644 (file)
@@ -24,6 +24,8 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A querypage to show categories ordered in descending order by the pages in them
  *
index d102791..f5c2c5f 100644 (file)
@@ -22,6 +22,8 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Special page lists templates with a large number of
  * transclusion links, i.e. "most used" templates
index 298d6c4..7d8a493 100644 (file)
@@ -77,7 +77,7 @@ class MovePageForm extends UnlistedSpecialPage {
                $request = $this->getRequest();
                $target = !is_null( $par ) ? $par : $request->getVal( 'target' );
 
-               // Yes, the use of getVal() and getText() is wanted, see bug 20365
+               // Yes, the use of getVal() and getText() is wanted, see T22365
 
                $oldTitleText = $request->getVal( 'wpOldTitle', $target );
                $this->oldTitle = Title::newFromText( $oldTitleText );
@@ -620,7 +620,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        // a redirect to the new title. This is not safe, but what we did before was
                        // even worse: we just determined whether a redirect should have been created,
                        // and reported that it was created if it should have, without any checks.
-                       // Also note that isRedirect() is unreliable because of bug 37209.
+                       // Also note that isRedirect() is unreliable because of T39209.
                        $msgName = 'movepage-moved-redirect';
                } else {
                        $msgName = 'movepage-moved-noredirect';
@@ -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
@@ -706,7 +708,7 @@ class MovePageForm extends UnlistedSpecialPage {
 
                        $newPageName = preg_replace(
                                '#^' . preg_quote( $ot->getDBkey(), '#' ) . '#',
-                               StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # bug 21234
+                               StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # T23234
                                $oldSubpage->getDBkey()
                        );
 
@@ -719,7 +721,7 @@ class MovePageForm extends UnlistedSpecialPage {
                                $newNs = $nt->getSubjectPage()->getNamespace();
                        }
 
-                       # Bug 14385: we need makeTitleSafe because the new page names may
+                       # T16385: we need makeTitleSafe because the new page names may
                        # be longer than 255 characters.
                        $newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
                        if ( !$newSubpage ) {
index 8546a08..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;
        }
 
@@ -130,20 +136,28 @@ class SpecialPageLanguage extends FormSpecialPage {
                }
 
                // Url to redirect to after the operation
-               $this->goToUrl = $title->getFullURL();
+               $this->goToUrl = $title->getFullURL(
+                       $title->isRedirect() ? [ 'redirect' => 'no' ] : []
+               );
 
-               return self::changePageLanguage( $this->getContext(), $title, $newLanguage );
+               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, array $tags = [] ) {
+               $newLanguage, $reason, array $tags = [] ) {
                // Get the default language for the wiki
                $defLang = $context->getConfig()->get( 'LanguageCode' );
 
@@ -218,6 +232,7 @@ class SpecialPageLanguage extends FormSpecialPage {
                $entry->setPerformer( $context->getUser() );
                $entry->setTarget( $title );
                $entry->setParameters( $logParams );
+               $entry->setComment( $reason );
                $entry->setTags( $tags );
 
                $logid = $entry->insert();
index 4671591..34ffa07 100644 (file)
@@ -83,7 +83,7 @@ class SpecialPrefixindex extends SpecialAllPages {
                        $showme = $from;
                }
 
-               // Bug 27864: if transcluded, show all pages instead of the form.
+               // T29864: if transcluded, show all pages instead of the form.
                if ( $this->including() || $showme != '' || $ns !== null ) {
                        $this->showPrefixChunk( $namespace, $showme, $from );
                } else {
index 5bdae15..8e20d88 100644 (file)
@@ -21,8 +21,6 @@
  * @ingroup SpecialPage
  */
 
-use MediaWiki\Linker\LinkRenderer;
-
 /**
  * A special page that lists protected pages
  *
@@ -273,317 +271,3 @@ class SpecialProtectedpages extends SpecialPage {
                return 'maintenance';
        }
 }
-
-/**
- * @todo document
- * @ingroup Pager
- */
-class ProtectedPagesPager extends TablePager {
-       public $mForm, $mConds;
-       private $type, $level, $namespace, $sizetype, $size, $indefonly, $cascadeonly, $noredirect;
-
-       /**
-        * @var LinkRenderer
-        */
-       private $linkRenderer;
-
-       /**
-        * @param SpecialProtectedpages $form
-        * @param array $conds
-        * @param $type
-        * @param $level
-        * @param $namespace
-        * @param string $sizetype
-        * @param int $size
-        * @param bool $indefonly
-        * @param bool $cascadeonly
-        * @param bool $noredirect
-        * @param LinkRenderer $linkRenderer
-        */
-       function __construct( $form, $conds = [], $type, $level, $namespace,
-               $sizetype = '', $size = 0, $indefonly = false, $cascadeonly = false, $noredirect = false,
-               LinkRenderer $linkRenderer
-       ) {
-               $this->mForm = $form;
-               $this->mConds = $conds;
-               $this->type = ( $type ) ? $type : 'edit';
-               $this->level = $level;
-               $this->namespace = $namespace;
-               $this->sizetype = $sizetype;
-               $this->size = intval( $size );
-               $this->indefonly = (bool)$indefonly;
-               $this->cascadeonly = (bool)$cascadeonly;
-               $this->noredirect = (bool)$noredirect;
-               $this->linkRenderer = $linkRenderer;
-               parent::__construct( $form->getContext() );
-       }
-
-       function preprocessResults( $result ) {
-               # Do a link batch query
-               $lb = new LinkBatch;
-               $userids = [];
-
-               foreach ( $result as $row ) {
-                       $lb->add( $row->page_namespace, $row->page_title );
-                       // field is nullable, maybe null on old protections
-                       if ( $row->log_user !== null ) {
-                               $userids[] = $row->log_user;
-                       }
-               }
-
-               // fill LinkBatch with user page and user talk
-               if ( count( $userids ) ) {
-                       $userCache = UserCache::singleton();
-                       $userCache->doQuery( $userids, [], __METHOD__ );
-                       foreach ( $userids as $userid ) {
-                               $name = $userCache->getProp( $userid, 'name' );
-                               if ( $name !== false ) {
-                                       $lb->add( NS_USER, $name );
-                                       $lb->add( NS_USER_TALK, $name );
-                               }
-                       }
-               }
-
-               $lb->execute();
-       }
-
-       function getFieldNames() {
-               static $headers = null;
-
-               if ( $headers == [] ) {
-                       $headers = [
-                               'log_timestamp' => 'protectedpages-timestamp',
-                               'pr_page' => 'protectedpages-page',
-                               'pr_expiry' => 'protectedpages-expiry',
-                               'log_user' => 'protectedpages-performer',
-                               'pr_params' => 'protectedpages-params',
-                               'log_comment' => 'protectedpages-reason',
-                       ];
-                       foreach ( $headers as $key => $val ) {
-                               $headers[$key] = $this->msg( $val )->text();
-                       }
-               }
-
-               return $headers;
-       }
-
-       /**
-        * @param string $field
-        * @param string $value
-        * @return string HTML
-        * @throws MWException
-        */
-       function formatValue( $field, $value ) {
-               /** @var $row object */
-               $row = $this->mCurrentRow;
-
-               switch ( $field ) {
-                       case 'log_timestamp':
-                               // when timestamp is null, this is a old protection row
-                               if ( $value === null ) {
-                                       $formatted = Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-unknown' ],
-                                               $this->msg( 'protectedpages-unknown-timestamp' )->escaped()
-                                       );
-                               } else {
-                                       $formatted = htmlspecialchars( $this->getLanguage()->userTimeAndDate(
-                                               $value, $this->getUser() ) );
-                               }
-                               break;
-
-                       case 'pr_page':
-                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-                               if ( !$title ) {
-                                       $formatted = Html::element(
-                                               'span',
-                                               [ 'class' => 'mw-invalidtitle' ],
-                                               Linker::getInvalidTitleDescription(
-                                                       $this->getContext(),
-                                                       $row->page_namespace,
-                                                       $row->page_title
-                                               )
-                                       );
-                               } else {
-                                       $formatted = $this->linkRenderer->makeLink( $title );
-                               }
-                               if ( !is_null( $row->page_len ) ) {
-                                       $formatted .= $this->getLanguage()->getDirMark() .
-                                               ' ' . Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-length' ],
-                                               Linker::formatRevisionSize( $row->page_len )
-                                       );
-                               }
-                               break;
-
-                       case 'pr_expiry':
-                               $formatted = htmlspecialchars( $this->getLanguage()->formatExpiry(
-                                       $value, /* User preference timezone */true ) );
-                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-                               if ( $this->getUser()->isAllowed( 'protect' ) && $title ) {
-                                       $changeProtection = $this->linkRenderer->makeKnownLink(
-                                               $title,
-                                               $this->msg( 'protect_change' )->text(),
-                                               [],
-                                               [ 'action' => 'unprotect' ]
-                                       );
-                                       $formatted .= ' ' . Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-actions' ],
-                                               $this->msg( 'parentheses' )->rawParams( $changeProtection )->escaped()
-                                       );
-                               }
-                               break;
-
-                       case 'log_user':
-                               // when timestamp is null, this is a old protection row
-                               if ( $row->log_timestamp === null ) {
-                                       $formatted = Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-unknown' ],
-                                               $this->msg( 'protectedpages-unknown-performer' )->escaped()
-                                       );
-                               } else {
-                                       $username = UserCache::singleton()->getProp( $value, 'name' );
-                                       if ( LogEventsList::userCanBitfield(
-                                               $row->log_deleted,
-                                               LogPage::DELETED_USER,
-                                               $this->getUser()
-                                       ) ) {
-                                               if ( $username === false ) {
-                                                       $formatted = htmlspecialchars( $value );
-                                               } else {
-                                                       $formatted = Linker::userLink( $value, $username )
-                                                               . Linker::userToolLinks( $value, $username );
-                                               }
-                                       } else {
-                                               $formatted = $this->msg( 'rev-deleted-user' )->escaped();
-                                       }
-                                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_USER ) ) {
-                                               $formatted = '<span class="history-deleted">' . $formatted . '</span>';
-                                       }
-                               }
-                               break;
-
-                       case 'pr_params':
-                               $params = [];
-                               // Messages: restriction-level-sysop, restriction-level-autoconfirmed
-                               $params[] = $this->msg( 'restriction-level-' . $row->pr_level )->escaped();
-                               if ( $row->pr_cascade ) {
-                                       $params[] = $this->msg( 'protect-summary-cascade' )->escaped();
-                               }
-                               $formatted = $this->getLanguage()->commaList( $params );
-                               break;
-
-                       case 'log_comment':
-                               // when timestamp is null, this is an old protection row
-                               if ( $row->log_timestamp === null ) {
-                                       $formatted = Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-unknown' ],
-                                               $this->msg( 'protectedpages-unknown-reason' )->escaped()
-                                       );
-                               } else {
-                                       if ( LogEventsList::userCanBitfield(
-                                               $row->log_deleted,
-                                               LogPage::DELETED_COMMENT,
-                                               $this->getUser()
-                                       ) ) {
-                                               $formatted = Linker::formatComment( $value !== null ? $value : '' );
-                                       } else {
-                                               $formatted = $this->msg( 'rev-deleted-comment' )->escaped();
-                                       }
-                                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
-                                               $formatted = '<span class="history-deleted">' . $formatted . '</span>';
-                                       }
-                               }
-                               break;
-
-                       default:
-                               throw new MWException( "Unknown field '$field'" );
-               }
-
-               return $formatted;
-       }
-
-       function getQueryInfo() {
-               $conds = $this->mConds;
-               $conds[] = 'pr_expiry > ' . $this->mDb->addQuotes( $this->mDb->timestamp() ) .
-                       ' OR pr_expiry IS NULL';
-               $conds[] = 'page_id=pr_page';
-               $conds[] = 'pr_type=' . $this->mDb->addQuotes( $this->type );
-
-               if ( $this->sizetype == 'min' ) {
-                       $conds[] = 'page_len>=' . $this->size;
-               } elseif ( $this->sizetype == 'max' ) {
-                       $conds[] = 'page_len<=' . $this->size;
-               }
-
-               if ( $this->indefonly ) {
-                       $infinity = $this->mDb->addQuotes( $this->mDb->getInfinity() );
-                       $conds[] = "pr_expiry = $infinity OR pr_expiry IS NULL";
-               }
-               if ( $this->cascadeonly ) {
-                       $conds[] = 'pr_cascade = 1';
-               }
-               if ( $this->noredirect ) {
-                       $conds[] = 'page_is_redirect = 0';
-               }
-
-               if ( $this->level ) {
-                       $conds[] = 'pr_level=' . $this->mDb->addQuotes( $this->level );
-               }
-               if ( !is_null( $this->namespace ) ) {
-                       $conds[] = 'page_namespace=' . $this->mDb->addQuotes( $this->namespace );
-               }
-
-               return [
-                       'tables' => [ 'page', 'page_restrictions', 'log_search', 'logging' ],
-                       'fields' => [
-                               'pr_id',
-                               'page_namespace',
-                               'page_title',
-                               'page_len',
-                               'pr_type',
-                               'pr_level',
-                               'pr_expiry',
-                               'pr_cascade',
-                               'log_timestamp',
-                               'log_user',
-                               'log_comment',
-                               'log_deleted',
-                       ],
-                       'conds' => $conds,
-                       'join_conds' => [
-                               'log_search' => [
-                                       'LEFT JOIN', [
-                                               'ls_field' => 'pr_id', 'ls_value = ' . $this->mDb->buildStringCast( 'pr_id' )
-                                       ]
-                               ],
-                               'logging' => [
-                                       'LEFT JOIN', [
-                                               'ls_log_id = log_id'
-                                       ]
-                               ]
-                       ]
-               ];
-       }
-
-       protected function getTableClass() {
-               return parent::getTableClass() . ' mw-protectedpages';
-       }
-
-       function getIndexField() {
-               return 'pr_id';
-       }
-
-       function getDefaultSort() {
-               return 'pr_id';
-       }
-
-       function isFieldSortable( $field ) {
-               // no index for sorting exists
-               return false;
-       }
-}
index b2e5674..eb29907 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * A special page that lists last changes made to the wiki
@@ -455,14 +456,31 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $panel[] = $form;
                $panelString = implode( "\n", $panel );
 
-               $this->getOutput()->addHTML(
-                       Xml::fieldset(
-                               $this->msg( 'recentchanges-legend' )->text(),
-                               $panelString,
-                               [ 'class' => 'rcoptions' ]
-                       )
+               $rcoptions = Xml::fieldset(
+                       $this->msg( 'recentchanges-legend' )->text(),
+                       $panelString,
+                       [ 'class' => 'rcoptions' ]
                );
 
+               // Insert a placeholder for RCFilters
+               if ( $this->getUser()->getOption( 'rcenhancedfilters' ) ) {
+                       $rcfilterContainer = Html::element(
+                               'div',
+                               [ 'class' => 'rcfilters-container' ]
+                       );
+
+                       // Wrap both with rcfilters-head
+                       $this->getOutput()->addHTML(
+                               Html::rawElement(
+                                       'div',
+                                       [ 'class' => 'rcfilters-head' ],
+                                       $rcfilterContainer . $rcoptions
+                               )
+                       );
+               } else {
+                       $this->getOutput()->addHTML( $rcoptions );
+               }
+
                $this->setBottomText( $opts );
        }
 
@@ -526,13 +544,9 @@ 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' );
+               if ( $this->getUser()->getOption( 'rcenhancedfilters' ) ) {
+                       $out->addModules( 'mediawiki.rcfilters.filters.ui' );
+                       $out->addModuleStyles( 'mediawiki.rcfilters.filters.base.styles' );
                }
        }
 
@@ -668,7 +682,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        function makeOptionsLink( $title, $override, $options, $active = false ) {
                $params = $override + $options;
 
-               // Bug 36524: false values have be converted to "0" otherwise
+               // T38524: false values have be converted to "0" otherwise
                // wfArrayToCgi() will omit it them.
                foreach ( $params as &$value ) {
                        if ( $value === false ) {
@@ -681,7 +695,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $title = new HtmlArmor( '<strong>' . htmlspecialchars( $title ) . '</strong>' );
                }
 
-               return $this->getLinkRenderer()->makeKnownLink( $this->getPageTitle(), $title, [], $params );
+               return $this->getLinkRenderer()->makeKnownLink( $this->getPageTitle(), $title, [
+                       'data-params' => json_encode( $override ),
+                       'data-keys' => implode( ',', array_keys( $override ) ),
+               ], $params );
        }
 
        /**
@@ -817,9 +834,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
        function filterOnUserExperienceLevel( &$tables, &$conds, &$join_conds, $opts ) {
                global $wgLearnerEdits,
-                          $wgExperiencedUserEdits,
-                          $wgLearnerMemberSince,
-                          $wgExperiencedUserMemberSince;
+                       $wgExperiencedUserEdits,
+                       $wgLearnerMemberSince,
+                       $wgExperiencedUserMemberSince;
 
                $selectedExpLevels = explode( ',', strtolower( $opts['userExpLevel'] ) );
                // remove values that are not recognized
index 727179a..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;
                }
 
@@ -298,33 +318,6 @@ class SpecialSearch extends SpecialPage {
                        $textMatches = $textStatus->getValue();
                }
 
-               // did you mean... suggestions
-               $didYouMeanHtml = '';
-               if ( $showSuggestion && $textMatches ) {
-                       if ( $textMatches->hasRewrittenQuery() ) {
-                               $didYouMeanHtml = $this->getDidYouMeanRewrittenHtml( $term, $textMatches );
-                       } elseif ( $textMatches->hasSuggestion() ) {
-                               $didYouMeanHtml = $this->getDidYouMeanHtml( $textMatches );
-                       }
-               }
-
-               if ( !Hooks::run( 'SpecialSearchResultsPrepend', [ $this, $out, $term ] ) ) {
-                       # Hook requested termination
-                       return;
-               }
-
-               // start rendering the page
-               $out->addHTML(
-                       Xml::openElement(
-                               'form',
-                               [
-                                       'id' => ( $this->isPowerSearch() ? 'powersearch' : 'search' ),
-                                       'method' => 'get',
-                                       'action' => wfScript(),
-                               ]
-                       )
-               );
-
                // Get number of results
                $titleMatchesNum = $textMatchesNum = $numTitleMatches = $numTextMatches = 0;
                if ( $titleMatches ) {
@@ -334,33 +327,31 @@ class SpecialSearch extends SpecialPage {
                if ( $textMatches ) {
                        $textMatchesNum = $textMatches->numRows();
                        $numTextMatches = $textMatches->getTotalHits();
+                       if ( $textMatchesNum > 0 ) {
+                               $search->augmentSearchResults( $textMatches );
+                       }
                }
                $num = $titleMatchesNum + $textMatchesNum;
                $totalRes = $numTitleMatches + $numTextMatches;
 
+               // start rendering the page
                $out->enableOOUI();
-               $out->addHTML(
-                       # This is an awful awful ID name. It's not a table, but we
-                       # named it poorly from when this was a table so now we're
-                       # stuck with it
-                       Xml::openElement( 'div', [ 'id' => 'mw-search-top-table' ] ) .
-                       $this->shortDialog( $term, $num, $totalRes ) .
-                       Xml::closeElement( 'div' ) .
-                       $this->searchProfileTabs( $term ) .
-                       $this->searchOptions( $term ) .
-                       Xml::closeElement( 'form' ) .
-                       $didYouMeanHtml
-               );
+               $out->addHTML( $formWidget->render(
+                       $this->profile, $term, $num, $totalRes, $this->offset, $this->isPowerSearch()
+               ) );
 
-               $filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
-               if ( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
-                       // Empty query -- straight view of search form
-                       return;
+               // did you mean... suggestions
+               if ( $textMatches ) {
+                       $dymWidget = new MediaWiki\Widget\Search\DidYouMeanWidget( $this );
+                       $out->addHTML( $dymWidget->render( $term, $textMatches ) );
                }
 
                $out->addHTML( "<div class='searchresults'>" );
 
                $hasErrors = $textStatus && $textStatus->getErrors();
+               $hasOtherResults = $textMatches &&
+                       $textMatches->hasInterwikiResults( SearchResultSet::INLINE_RESULTS );
+
                if ( $hasErrors ) {
                        list( $error, $warning ) = $textStatus->splitByErrorType();
                        if ( $error->getErrors() ) {
@@ -379,83 +370,51 @@ class SpecialSearch extends SpecialPage {
                        }
                }
 
-               // prev/next links
-               $prevnext = null;
-               if ( $num || $this->offset ) {
-                       // Show the create link ahead
-                       $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
-                       if ( $totalRes > $this->limit || $this->offset ) {
-                               if ( $this->searchEngineType !== null ) {
-                                       $this->setExtraParam( 'srbackend', $this->searchEngineType );
-                               }
-                               $prevnext = $this->getLanguage()->viewPrevNext(
-                                       $this->getPageTitle(),
-                                       $this->offset,
-                                       $this->limit,
-                                       $this->powerSearchOptions() + [ 'search' => $term ],
-                                       $this->limit + $this->offset >= $totalRes
-                               );
-                       }
-               }
+               // 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 ) {
-                       // 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' );
-                       }
+               // Although $num might be 0 there can still be secondary or inline
+               // results to display.
+               $linkRenderer = $this->getLinkRenderer();
+               $mainResultWidget = new FullSearchResultWidget( $this, $linkRenderer );
 
-                       // show results
-                       if ( $numTextMatches > 0 ) {
-                               $search->augmentSearchResults( $textMatches );
-                               $out->addHTML( $this->showMatches( $textMatches ) );
-                       }
+               if ( $search->getFeatureData( 'enable-new-crossproject-page' ) ) {
 
-                       // show secondary interwiki results if any
-                       if ( $textMatches->hasInterwikiResults( SearchResultSet::SECONDARY_RESULTS ) ) {
-                               $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(
-                                               SearchResultSet::SECONDARY_RESULTS ), $term ) );
-                       }
+                       $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 we have no results and we have not already displayed an error message
-               if ( $num === 0 && !$hasErrors ) {
-                       if ( !$this->offset ) {
-                               // If we have an offset the create link was rendered earlier in this function.
-                               // This class needs a good de-spaghettification, but for now this will
-                               // do the job.
-                               $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
-                       }
-                       $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>", [
-                               $hasOtherResults ? 'search-nonefound-thiswiki' : 'search-nonefound',
-                               wfEscapeWikiText( $term )
-                       ] );
-               }
+               $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 ) {
@@ -464,114 +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() );
-
-               $linkRenderer = $this->getLinkRenderer();
-
-               $snippet = $textMatches->getSuggestionSnippet() ?: null;
-               if ( $snippet !== null ) {
-                       $snippet = new HtmlArmor( $snippet );
-               }
-
-               $suggest = $linkRenderer->makeKnownLink(
-                       $this->getPageTitle(),
-                       $snippet,
-                       [ '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() );
-
-               $linkRenderer = $this->getLinkRenderer();
-
-               $snippet = $textMatches->getQueryAfterRewriteSnippet() ?: null;
-               if ( $snippet !== null ) {
-                       $snippet = new HtmlArmor( $snippet );
-               }
-
-               $rewritten = $linkRenderer->makeKnownLink(
-                       $this->getPageTitle(),
-                       $snippet,
-                       [ 'id' => 'mw-search-DYM-rewritten' ],
-                       $stParams
-               );
-
-               $stParams['search'] = $term;
-               $stParams['runsuggestion'] = 0;
-               $original = $linkRenderer->makeKnownLink(
-                       $this->getPageTitle(),
-                       $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
@@ -622,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' )
@@ -633,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',
+               ] );
        }
 
        /**
@@ -666,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;
@@ -719,446 +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 ] );
-
-               $linkRenderer = $this->getLinkRenderer();
-
-               if ( $titleSnippet !== null ) {
-                       $titleSnippet = new HtmlArmor( $titleSnippet );
-               }
-
-               $link = $linkRenderer->makeKnownLink(
-                       $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;
-                       }
-
-                       if ( $redirectText !== null ) {
-                               $redirectText = new HtmlArmor( $redirectText );
-                       }
-
-                       $redirect = "<span class='searchalttitle'>" .
-                               $this->msg( 'search-redirect' )->rawParams(
-                                       $linkRenderer->makeKnownLink( $redirectTitle, $redirectText ) )->text() .
-                               "</span>";
-               }
-
-               $section = '';
-               if ( !is_null( $sectionTitle ) ) {
-                       if ( $sectionText == '' ) {
-                               $sectionText = null;
-                       }
-
-                       if ( $sectionText !== null ) {
-                               $sectionText = new HtmlArmor( $sectionText );
-                       }
-
-                       $section = "<span class='searchalttitle'>" .
-                               $this->msg( 'search-section' )->rawParams(
-                                       $linkRenderer->makeKnownLink( $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 '';
-               }
-
-               $linkRenderer = $this->getLinkRenderer();
-
-               $title = $result->getTitle();
-
-               $titleSnippet = $result->getTitleSnippet();
-
-               if ( $titleSnippet == '' ) {
-                       $titleSnippet = null;
-               }
-
-               if ( $titleSnippet !== null ) {
-                       $titleSnippet = new HtmlArmor( $titleSnippet );
-               }
-
-               $link = $linkRenderer->makeKnownLink(
-                       $title,
-                       $titleSnippet
-               );
-
-               // format redirect if any
-               $redirectTitle = $result->getRedirectTitle();
-               $redirectText = $result->getRedirectSnippet();
-               $redirect = '';
-               if ( !is_null( $redirectTitle ) ) {
-                       if ( $redirectText == '' ) {
-                               $redirectText = null;
-                       }
-
-                       if ( $redirectText !== null ) {
-                               $redirectText = new HtmlArmor( $redirectText );
-                       }
-
-                       $redirect = "<span class='searchalttitle'>" .
-                               $this->msg( 'search-redirect' )->rawParams(
-                                       $linkRenderer->makeKnownLink( $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 = $linkRenderer->makeKnownLink(
-                               $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
         */
@@ -1204,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 a78b082..a5e5113 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * SpecialShortpages extends QueryPage. It is used to return the shortest
  * pages in the database.
index 3342c32..19850e6 100644 (file)
@@ -95,8 +95,11 @@ class SpecialStatistics extends SpecialPage {
                        if ( !$msg->isDisabled() ) {
                                $descriptionHtml = $this->msg( 'parentheses' )->rawParams( $msg->parse() )
                                        ->escaped();
-                               $text .= "<br />" . Html::rawElement( 'small', [ 'class' => 'mw-statistic-desc' ],
-                                       " $descriptionHtml" );
+                               $text .= "<br />" . Html::rawElement(
+                                       'small',
+                                       [ 'class' => 'mw-statistic-desc' ],
+                                       " $descriptionHtml"
+                               );
                        }
                }
 
@@ -119,8 +122,10 @@ class SpecialStatistics extends SpecialPage {
                        Xml::tags( 'th', [ 'colspan' => '2' ], $this->msg( 'statistics-header-pages' )
                                ->parse() ) .
                        Xml::closeElement( 'tr' ) .
-                               $this->formatRow( $linkRenderer->makeKnownLink( $specialAllPagesTitle,
-                                       $this->msg( 'statistics-articles' )->text(), [], [ 'hideredirects' => 1 ] ),
+                               $this->formatRow( $linkRenderer->makeKnownLink(
+                                       $specialAllPagesTitle,
+                                       $this->msg( 'statistics-articles' )->text(),
+                                       [], [ 'hideredirects' => 1 ] ),
                                        $this->getLanguage()->formatNum( $this->good ),
                                        [ 'class' => 'mw-statistics-articles' ],
                                        'statistics-articles-desc' ) .
@@ -152,9 +157,9 @@ class SpecialStatistics extends SpecialPage {
                                [ 'class' => 'mw-statistics-edits' ]
                        ) .
                        $this->formatRow( $this->msg( 'statistics-edits-average' )->parse(),
-                               $this->getLanguage()
-                                       ->formatNum( sprintf( '%.2f', $this->total ? $this->edits / $this->total : 0 ) ),
-                               [ 'class' => 'mw-statistics-edits-average' ]
+                               $this->getLanguage()->formatNum(
+                                       sprintf( '%.2f', $this->total ? $this->edits / $this->total : 0 )
+                               ), [ 'class' => 'mw-statistics-edits-average' ]
                        );
        }
 
@@ -175,7 +180,8 @@ class SpecialStatistics extends SpecialPage {
                                $this->getLanguage()->formatNum( $this->activeUsers ),
                                [ 'class' => 'mw-statistics-users-active' ],
                                'statistics-users-active-desc',
-                               $this->getLanguage()->formatNum( $this->getConfig()->get( 'ActiveUserDays' ) )
+                               $this->getLanguage()->formatNum(
+                                       $this->getConfig()->get( 'ActiveUserDays' ) )
                        );
        }
 
@@ -184,7 +190,8 @@ class SpecialStatistics extends SpecialPage {
                $text = '';
                foreach ( $this->getConfig()->get( 'GroupPermissions' ) as $group => $permissions ) {
                        # Skip generic * and implicit groups
-                       if ( in_array( $group, $this->getConfig()->get( 'ImplicitGroups' ) ) || $group == '*' ) {
+                       if ( in_array( $group, $this->getConfig()->get( 'ImplicitGroups' ) )
+                               || $group == '*' ) {
                                continue;
                        }
                        $groupname = htmlspecialchars( $group );
@@ -196,7 +203,8 @@ class SpecialStatistics extends SpecialPage {
                        }
                        $msg = $this->msg( 'grouppage-' . $groupname )->inContentLanguage();
                        if ( $msg->isBlank() ) {
-                               $grouppageLocalized = MWNamespace::getCanonicalName( NS_PROJECT ) . ':' . $groupname;
+                               $grouppageLocalized = MWNamespace::getCanonicalName( NS_PROJECT ) .
+                                       ':' . $groupname;
                        } else {
                                $grouppageLocalized = $msg->text();
                        }
index 8ff0527..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,11 +68,11 @@ 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';
 
@@ -143,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 0d42e3f..01125fc 100644 (file)
@@ -186,7 +186,7 @@ class SpecialUnblock extends SpecialPage {
                        return [ [ 'ipb_cant_unblock', $target ] ];
                }
 
-               # bug 15810: blocked admins should have limited access here.  This
+               # T17810: blocked admins should have limited access here.  This
                # won't allow sysops to remove autoblocks on themselves, but they
                # should have ipblock-exempt anyway
                $status = SpecialBlock::checkUnblockSelf( $target, $performer );
index 86d8f89..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
index 3d51842..dc5f877 100644 (file)
  * @file
  * @ingroup SpecialPage
  */
-use MediaWiki\MediaWikiServices;
 
-/**
- * Used to show archived pages and eventually restore them.
- *
- * @ingroup SpecialPage
- */
-class PageArchive {
-       /** @var Title */
-       protected $title;
-
-       /** @var Status */
-       protected $fileStatus;
-
-       /** @var Status */
-       protected $revisionStatus;
-
-       /** @var Config */
-       protected $config;
-
-       function __construct( $title, Config $config = null ) {
-               if ( is_null( $title ) ) {
-                       throw new MWException( __METHOD__ . ' given a null title.' );
-               }
-               $this->title = $title;
-               if ( $config === null ) {
-                       wfDebug( __METHOD__ . ' did not have a Config object passed to it' );
-                       $config = MediaWikiServices::getInstance()->getMainConfig();
-               }
-               $this->config = $config;
-       }
-
-       public function doesWrites() {
-               return true;
-       }
-
-       /**
-        * List all deleted pages recorded in the archive table. Returns result
-        * wrapper with (ar_namespace, ar_title, count) fields, ordered by page
-        * namespace/title.
-        *
-        * @return ResultWrapper
-        */
-       public static function listAllPages() {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               return self::listPages( $dbr, '' );
-       }
-
-       /**
-        * List deleted pages recorded in the archive table matching the
-        * given title prefix.
-        * Returns result wrapper with (ar_namespace, ar_title, count) fields.
-        *
-        * @param string $prefix Title prefix
-        * @return ResultWrapper
-        */
-       public static function listPagesByPrefix( $prefix ) {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               $title = Title::newFromText( $prefix );
-               if ( $title ) {
-                       $ns = $title->getNamespace();
-                       $prefix = $title->getDBkey();
-               } else {
-                       // Prolly won't work too good
-                       // @todo handle bare namespace names cleanly?
-                       $ns = 0;
-               }
-
-               $conds = [
-                       'ar_namespace' => $ns,
-                       'ar_title' . $dbr->buildLike( $prefix, $dbr->anyString() ),
-               ];
-
-               return self::listPages( $dbr, $conds );
-       }
-
-       /**
-        * @param IDatabase $dbr
-        * @param string|array $condition
-        * @return bool|ResultWrapper
-        */
-       protected static function listPages( $dbr, $condition ) {
-               return $dbr->select(
-                       [ 'archive' ],
-                       [
-                               'ar_namespace',
-                               'ar_title',
-                               'count' => 'COUNT(*)'
-                       ],
-                       $condition,
-                       __METHOD__,
-                       [
-                               'GROUP BY' => [ 'ar_namespace', 'ar_title' ],
-                               'ORDER BY' => [ 'ar_namespace', 'ar_title' ],
-                               'LIMIT' => 100,
-                       ]
-               );
-       }
-
-       /**
-        * List the revisions of the given page. Returns result wrapper with
-        * (ar_minor_edit, ar_timestamp, ar_user, ar_user_text, ar_comment) fields.
-        *
-        * @return ResultWrapper
-        */
-       function listRevisions() {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               $tables = [ 'archive' ];
-
-               $fields = [
-                       'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text',
-                       'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1',
-               ];
-
-               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
-                       $fields[] = 'ar_content_format';
-                       $fields[] = 'ar_content_model';
-               }
-
-               $conds = [ 'ar_namespace' => $this->title->getNamespace(),
-                       'ar_title' => $this->title->getDBkey() ];
-
-               $options = [ 'ORDER BY' => 'ar_timestamp DESC' ];
-
-               $join_conds = [];
-
-               ChangeTags::modifyDisplayQuery(
-                       $tables,
-                       $fields,
-                       $conds,
-                       $join_conds,
-                       $options,
-                       ''
-               );
-
-               return $dbr->select( $tables,
-                       $fields,
-                       $conds,
-                       __METHOD__,
-                       $options,
-                       $join_conds
-               );
-       }
-
-       /**
-        * List the deleted file revisions for this page, if it's a file page.
-        * Returns a result wrapper with various filearchive fields, or null
-        * if not a file page.
-        *
-        * @return ResultWrapper
-        * @todo Does this belong in Image for fuller encapsulation?
-        */
-       function listFiles() {
-               if ( $this->title->getNamespace() != NS_FILE ) {
-                       return null;
-               }
-
-               $dbr = wfGetDB( DB_REPLICA );
-               return $dbr->select(
-                       'filearchive',
-                       ArchivedFile::selectFields(),
-                       [ 'fa_name' => $this->title->getDBkey() ],
-                       __METHOD__,
-                       [ 'ORDER BY' => 'fa_timestamp DESC' ]
-               );
-       }
-
-       /**
-        * Return a Revision object containing data for the deleted revision.
-        * Note that the result *may* or *may not* have a null page ID.
-        *
-        * @param string $timestamp
-        * @return Revision|null
-        */
-       function getRevision( $timestamp ) {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               $fields = [
-                       'ar_rev_id',
-                       'ar_text',
-                       'ar_comment',
-                       'ar_user',
-                       'ar_user_text',
-                       'ar_timestamp',
-                       'ar_minor_edit',
-                       'ar_flags',
-                       'ar_text_id',
-                       'ar_deleted',
-                       'ar_len',
-                       'ar_sha1',
-               ];
-
-               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
-                       $fields[] = 'ar_content_format';
-                       $fields[] = 'ar_content_model';
-               }
-
-               $row = $dbr->selectRow( 'archive',
-                       $fields,
-                       [ 'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey(),
-                               'ar_timestamp' => $dbr->timestamp( $timestamp ) ],
-                       __METHOD__ );
-
-               if ( $row ) {
-                       return Revision::newFromArchiveRow( $row, [ 'title' => $this->title ] );
-               }
-
-               return null;
-       }
-
-       /**
-        * Return the most-previous revision, either live or deleted, against
-        * the deleted revision given by timestamp.
-        *
-        * May produce unexpected results in case of history merges or other
-        * unusual time issues.
-        *
-        * @param string $timestamp
-        * @return Revision|null Null when there is no previous revision
-        */
-       function getPreviousRevision( $timestamp ) {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               // Check the previous deleted revision...
-               $row = $dbr->selectRow( 'archive',
-                       'ar_timestamp',
-                       [ 'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey(),
-                               'ar_timestamp < ' .
-                                       $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ],
-                       __METHOD__,
-                       [
-                               'ORDER BY' => 'ar_timestamp DESC',
-                               'LIMIT' => 1 ] );
-               $prevDeleted = $row ? wfTimestamp( TS_MW, $row->ar_timestamp ) : false;
-
-               $row = $dbr->selectRow( [ 'page', 'revision' ],
-                       [ 'rev_id', 'rev_timestamp' ],
-                       [
-                               'page_namespace' => $this->title->getNamespace(),
-                               'page_title' => $this->title->getDBkey(),
-                               'page_id = rev_page',
-                               'rev_timestamp < ' .
-                                       $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ],
-                       __METHOD__,
-                       [
-                               'ORDER BY' => 'rev_timestamp DESC',
-                               'LIMIT' => 1 ] );
-               $prevLive = $row ? wfTimestamp( TS_MW, $row->rev_timestamp ) : false;
-               $prevLiveId = $row ? intval( $row->rev_id ) : null;
-
-               if ( $prevLive && $prevLive > $prevDeleted ) {
-                       // Most prior revision was live
-                       return Revision::newFromId( $prevLiveId );
-               } elseif ( $prevDeleted ) {
-                       // Most prior revision was deleted
-                       return $this->getRevision( $prevDeleted );
-               }
-
-               // No prior revision on this page.
-               return null;
-       }
-
-       /**
-        * Get the text from an archive row containing ar_text, ar_flags and ar_text_id
-        *
-        * @param object $row Database row
-        * @return string
-        */
-       function getTextFromRow( $row ) {
-               if ( is_null( $row->ar_text_id ) ) {
-                       // An old row from MediaWiki 1.4 or previous.
-                       // Text is embedded in this row in classic compression format.
-                       return Revision::getRevisionText( $row, 'ar_' );
-               }
-
-               // New-style: keyed to the text storage backend.
-               $dbr = wfGetDB( DB_REPLICA );
-               $text = $dbr->selectRow( 'text',
-                       [ 'old_text', 'old_flags' ],
-                       [ 'old_id' => $row->ar_text_id ],
-                       __METHOD__ );
-
-               return Revision::getRevisionText( $text );
-       }
-
-       /**
-        * Fetch (and decompress if necessary) the stored text of the most
-        * recently edited deleted revision of the page.
-        *
-        * If there are no archived revisions for the page, returns NULL.
-        *
-        * @return string|null
-        */
-       function getLastRevisionText() {
-               $dbr = wfGetDB( DB_REPLICA );
-               $row = $dbr->selectRow( 'archive',
-                       [ 'ar_text', 'ar_flags', 'ar_text_id' ],
-                       [ 'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey() ],
-                       __METHOD__,
-                       [ 'ORDER BY' => 'ar_timestamp DESC' ] );
-
-               if ( $row ) {
-                       return $this->getTextFromRow( $row );
-               }
-
-               return null;
-       }
-
-       /**
-        * Quick check if any archived revisions are present for the page.
-        *
-        * @return bool
-        */
-       function isDeleted() {
-               $dbr = wfGetDB( DB_REPLICA );
-               $n = $dbr->selectField( 'archive', 'COUNT(ar_title)',
-                       [ 'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey() ],
-                       __METHOD__
-               );
-
-               return ( $n > 0 );
-       }
-
-       /**
-        * Restore the given (or all) text and file revisions for the page.
-        * Once restored, the items will be removed from the archive tables.
-        * The deletion log will be updated with an undeletion notice.
-        *
-        * This also sets Status objects, $this->fileStatus and $this->revisionStatus
-        * (depending what operations are attempted).
-        *
-        * @param array $timestamps Pass an empty array to restore all revisions,
-        *   otherwise list the ones to undelete.
-        * @param string $comment
-        * @param array $fileVersions
-        * @param bool $unsuppress
-        * @param User $user User performing the action, or null to use $wgUser
-        * @param string|string[] $tags Change tags to add to log entry
-        *   ($user should be able to add the specified tags before this is called)
-        * @return array(number of file revisions restored, number of image revisions
-        *   restored, log message) on success, false on failure.
-        */
-       function undelete( $timestamps, $comment = '', $fileVersions = [],
-               $unsuppress = false, User $user = null, $tags = null
-       ) {
-               // If both the set of text revisions and file revisions are empty,
-               // restore everything. Otherwise, just restore the requested items.
-               $restoreAll = empty( $timestamps ) && empty( $fileVersions );
-
-               $restoreText = $restoreAll || !empty( $timestamps );
-               $restoreFiles = $restoreAll || !empty( $fileVersions );
-
-               if ( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
-                       $img = wfLocalFile( $this->title );
-                       $img->load( File::READ_LATEST );
-                       $this->fileStatus = $img->restore( $fileVersions, $unsuppress );
-                       if ( !$this->fileStatus->isOK() ) {
-                               return false;
-                       }
-                       $filesRestored = $this->fileStatus->successCount;
-               } else {
-                       $filesRestored = 0;
-               }
-
-               if ( $restoreText ) {
-                       $this->revisionStatus = $this->undeleteRevisions( $timestamps, $unsuppress, $comment );
-                       if ( !$this->revisionStatus->isOK() ) {
-                               return false;
-                       }
-
-                       $textRestored = $this->revisionStatus->getValue();
-               } else {
-                       $textRestored = 0;
-               }
-
-               // Touch the log!
-
-               if ( $textRestored && $filesRestored ) {
-                       $reason = wfMessage( 'undeletedrevisions-files' )
-                               ->numParams( $textRestored, $filesRestored )->inContentLanguage()->text();
-               } elseif ( $textRestored ) {
-                       $reason = wfMessage( 'undeletedrevisions' )->numParams( $textRestored )
-                               ->inContentLanguage()->text();
-               } elseif ( $filesRestored ) {
-                       $reason = wfMessage( 'undeletedfiles' )->numParams( $filesRestored )
-                               ->inContentLanguage()->text();
-               } else {
-                       wfDebug( "Undelete: nothing undeleted...\n" );
-
-                       return false;
-               }
-
-               if ( trim( $comment ) != '' ) {
-                       $reason .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
-               }
-
-               if ( $user === null ) {
-                       global $wgUser;
-                       $user = $wgUser;
-               }
-
-               $logEntry = new ManualLogEntry( 'delete', 'restore' );
-               $logEntry->setPerformer( $user );
-               $logEntry->setTarget( $this->title );
-               $logEntry->setComment( $reason );
-               $logEntry->setTags( $tags );
-
-               Hooks::run( 'ArticleUndeleteLogEntry', [ $this, &$logEntry, $user ] );
-
-               $logid = $logEntry->insert();
-               $logEntry->publish( $logid );
-
-               return [ $textRestored, $filesRestored, $reason ];
-       }
-
-       /**
-        * This is the meaty bit -- It restores archived revisions of the given page
-        * to the revision table.
-        *
-        * @param array $timestamps Pass an empty array to restore all revisions,
-        *   otherwise list the ones to undelete.
-        * @param bool $unsuppress Remove all ar_deleted/fa_deleted restrictions of seletected revs
-        * @param string $comment
-        * @throws ReadOnlyError
-        * @return Status Status object containing the number of revisions restored on success
-        */
-       private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
-               if ( wfReadOnly() ) {
-                       throw new ReadOnlyError();
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->startAtomic( __METHOD__ );
-
-               $restoreAll = empty( $timestamps );
-
-               # Does this page already exist? We'll have to update it...
-               $article = WikiPage::factory( $this->title );
-               # Load latest data for the current page (bug 31179)
-               $article->loadPageData( 'fromdbmaster' );
-               $oldcountable = $article->isCountable();
-
-               $page = $dbw->selectRow( 'page',
-                       [ 'page_id', 'page_latest' ],
-                       [ 'page_namespace' => $this->title->getNamespace(),
-                               'page_title' => $this->title->getDBkey() ],
-                       __METHOD__,
-                       [ 'FOR UPDATE' ] // lock page
-               );
-
-               if ( $page ) {
-                       $makepage = false;
-                       # Page already exists. Import the history, and if necessary
-                       # we'll update the latest revision field in the record.
-
-                       # Get the time span of this page
-                       $previousTimestamp = $dbw->selectField( 'revision', 'rev_timestamp',
-                               [ 'rev_id' => $page->page_latest ],
-                               __METHOD__ );
-
-                       if ( $previousTimestamp === false ) {
-                               wfDebug( __METHOD__ . ": existing page refers to a page_latest that does not exist\n" );
-
-                               $status = Status::newGood( 0 );
-                               $status->warning( 'undeleterevision-missing' );
-                               $dbw->endAtomic( __METHOD__ );
-
-                               return $status;
-                       }
-               } else {
-                       # Have to create a new article...
-                       $makepage = true;
-                       $previousTimestamp = 0;
-               }
-
-               $oldWhere = [
-                       'ar_namespace' => $this->title->getNamespace(),
-                       'ar_title' => $this->title->getDBkey(),
-               ];
-               if ( !$restoreAll ) {
-                       $oldWhere['ar_timestamp'] = array_map( [ &$dbw, 'timestamp' ], $timestamps );
-               }
-
-               $fields = [
-                       'ar_id',
-                       'ar_rev_id',
-                       'rev_id',
-                       'ar_text',
-                       'ar_comment',
-                       'ar_user',
-                       'ar_user_text',
-                       'ar_timestamp',
-                       'ar_minor_edit',
-                       'ar_flags',
-                       'ar_text_id',
-                       'ar_deleted',
-                       'ar_page_id',
-                       'ar_len',
-                       'ar_sha1'
-               ];
-
-               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
-                       $fields[] = 'ar_content_format';
-                       $fields[] = 'ar_content_model';
-               }
-
-               /**
-                * Select each archived revision...
-                */
-               $result = $dbw->select(
-                       [ 'archive', 'revision' ],
-                       $fields,
-                       $oldWhere,
-                       __METHOD__,
-                       /* options */
-                       [ 'ORDER BY' => 'ar_timestamp' ],
-                       [ 'revision' => [ 'LEFT JOIN', 'ar_rev_id=rev_id' ] ]
-               );
-
-               $rev_count = $result->numRows();
-               if ( !$rev_count ) {
-                       wfDebug( __METHOD__ . ": no revisions to restore\n" );
-
-                       $status = Status::newGood( 0 );
-                       $status->warning( "undelete-no-results" );
-                       $dbw->endAtomic( __METHOD__ );
-
-                       return $status;
-               }
-
-               // We use ar_id because there can be duplicate ar_rev_id even for the same
-               // page.  In this case, we may be able to restore the first one.
-               $restoreFailedArIds = [];
-
-               // Map rev_id to the ar_id that is allowed to use it.  When checking later,
-               // if it doesn't match, the current ar_id can not be restored.
-
-               // Value can be an ar_id or -1 (-1 means no ar_id can use it, since the
-               // rev_id is taken before we even start the restore).
-               $allowedRevIdToArIdMap = [];
-
-               $latestRestorableRow = null;
-
-               foreach ( $result as $row ) {
-                       if ( $row->ar_rev_id ) {
-                               // rev_id is taken even before we start restoring.
-                               if ( $row->ar_rev_id === $row->rev_id ) {
-                                       $restoreFailedArIds[] = $row->ar_id;
-                                       $allowedRevIdToArIdMap[$row->ar_rev_id] = -1;
-                               } else {
-                                       // rev_id is not taken yet in the DB, but it might be taken
-                                       // by a prior revision in the same restore operation. If
-                                       // not, we need to reserve it.
-                                       if ( isset( $allowedRevIdToArIdMap[$row->ar_rev_id] ) ) {
-                                               $restoreFailedArIds[] = $row->ar_id;
-                                       } else {
-                                               $allowedRevIdToArIdMap[$row->ar_rev_id] = $row->ar_id;
-                                               $latestRestorableRow = $row;
-                                       }
-                               }
-                       } else {
-                               // If ar_rev_id is null, there can't be a collision, and a
-                               // rev_id will be chosen automatically.
-                               $latestRestorableRow = $row;
-                       }
-               }
-
-               $result->seek( 0 ); // move back
-
-               $oldPageId = 0;
-               if ( $latestRestorableRow !== null ) {
-                       $oldPageId = (int)$latestRestorableRow->ar_page_id; // pass this to ArticleUndelete hook
-
-                       // grab the content to check consistency with global state before restoring the page.
-                       $revision = Revision::newFromArchiveRow( $latestRestorableRow,
-                               [
-                                       'title' => $article->getTitle(), // used to derive default content model
-                               ]
-                       );
-                       $user = User::newFromName( $revision->getUserText( Revision::RAW ), false );
-                       $content = $revision->getContent( Revision::RAW );
-
-                       // NOTE: article ID may not be known yet. prepareSave() should not modify the database.
-                       $status = $content->prepareSave( $article, 0, -1, $user );
-                       if ( !$status->isOK() ) {
-                               $dbw->endAtomic( __METHOD__ );
-
-                               return $status;
-                       }
-               }
-
-               $newid = false; // newly created page ID
-               $restored = 0; // number of revisions restored
-               /** @var Revision $revision */
-               $revision = null;
-
-               // If there are no restorable revisions, we can skip most of the steps.
-               if ( $latestRestorableRow === null ) {
-                       $failedRevisionCount = $rev_count;
-               } else {
-                       if ( $makepage ) {
-                               // Check the state of the newest to-be version...
-                               if ( !$unsuppress
-                                       && ( $latestRestorableRow->ar_deleted & Revision::DELETED_TEXT )
-                               ) {
-                                       $dbw->endAtomic( __METHOD__ );
-
-                                       return Status::newFatal( "undeleterevdel" );
-                               }
-                               // Safe to insert now...
-                               $newid = $article->insertOn( $dbw, $latestRestorableRow->ar_page_id );
-                               if ( $newid === false ) {
-                                       // The old ID is reserved; let's pick another
-                                       $newid = $article->insertOn( $dbw );
-                               }
-                               $pageId = $newid;
-                       } else {
-                               // Check if a deleted revision will become the current revision...
-                               if ( $latestRestorableRow->ar_timestamp > $previousTimestamp ) {
-                                       // Check the state of the newest to-be version...
-                                       if ( !$unsuppress
-                                               && ( $latestRestorableRow->ar_deleted & Revision::DELETED_TEXT )
-                                       ) {
-                                               $dbw->endAtomic( __METHOD__ );
-
-                                               return Status::newFatal( "undeleterevdel" );
-                                       }
-                               }
-
-                               $newid = false;
-                               $pageId = $article->getId();
-                       }
-
-                       foreach ( $result as $row ) {
-                               // Check for key dupes due to needed archive integrity.
-                               if ( $row->ar_rev_id && $allowedRevIdToArIdMap[$row->ar_rev_id] !== $row->ar_id ) {
-                                       continue;
-                               }
-                               // Insert one revision at a time...maintaining deletion status
-                               // unless we are specifically removing all restrictions...
-                               $revision = Revision::newFromArchiveRow( $row,
-                                       [
-                                               'page' => $pageId,
-                                               'title' => $this->title,
-                                               'deleted' => $unsuppress ? 0 : $row->ar_deleted
-                                       ] );
-
-                               $revision->insertOn( $dbw );
-                               $restored++;
-
-                               Hooks::run( 'ArticleRevisionUndeleted',
-                                       [ &$this->title, $revision, $row->ar_page_id ] );
-                       }
-
-                       // Now that it's safely stored, take it out of the archive
-                       // Don't delete rows that we failed to restore
-                       $toDeleteConds = $oldWhere;
-                       $failedRevisionCount = count( $restoreFailedArIds );
-                       if ( $failedRevisionCount > 0 ) {
-                               $toDeleteConds[] = 'ar_id NOT IN ( ' . $dbw->makeList( $restoreFailedArIds ) . ' )';
-                       }
-
-                       $dbw->delete( 'archive',
-                               $toDeleteConds,
-                               __METHOD__ );
-               }
-
-               $status = Status::newGood( $restored );
-
-               if ( $failedRevisionCount > 0 ) {
-                       $status->warning(
-                               wfMessage( 'undeleterevision-duplicate-revid', $failedRevisionCount ) );
-               }
-
-               // Was anything restored at all?
-               if ( $restored ) {
-                       $created = (bool)$newid;
-                       // Attach the latest revision to the page...
-                       $wasnew = $article->updateIfNewerOn( $dbw, $revision );
-                       if ( $created || $wasnew ) {
-                               // Update site stats, link tables, etc
-                               $article->doEditUpdates(
-                                       $revision,
-                                       User::newFromName( $revision->getUserText( Revision::RAW ), false ),
-                                       [
-                                               'created' => $created,
-                                               'oldcountable' => $oldcountable,
-                                               'restored' => true
-                                       ]
-                               );
-                       }
-
-                       Hooks::run( 'ArticleUndelete', [ &$this->title, $created, $comment, $oldPageId ] );
-                       if ( $this->title->getNamespace() == NS_FILE ) {
-                               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->title, 'imagelinks' ) );
-                       }
-               }
-
-               $dbw->endAtomic( __METHOD__ );
-
-               return $status;
-       }
-
-       /**
-        * @return Status
-        */
-       function getFileStatus() {
-               return $this->fileStatus;
-       }
-
-       /**
-        * @return Status
-        */
-       function getRevisionStatus() {
-               return $this->revisionStatus;
-       }
-}
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * Special page allowing users with the appropriate permissions to view
@@ -1141,8 +419,8 @@ class SpecialUndelete extends SpecialPage {
                                'textarea',
                                [
                                        'readonly' => 'readonly',
-                                       'cols' => $user->getIntOption( 'cols' ),
-                                       'rows' => $user->getIntOption( 'rows' )
+                                       'cols' => 80,
+                                       'rows' => 25
                                ],
                                $content->getNativeData() . "\n"
                        );
index ec39ccf..1469742 100644 (file)
@@ -55,7 +55,7 @@ class UnusedCategoriesPage extends QueryPage {
        }
 
        /**
-        * A should come before Z (bug 30907)
+        * A should come before Z (T32907)
         * @return bool
         */
        function sortDescending() {
index 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 96878a3..e82279e 100644 (file)
@@ -24,6 +24,8 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page that displays a list of pages that are not on anyones watchlist.
  *
index aabd450..f4a4818 100644 (file)
@@ -281,10 +281,12 @@ class SpecialUpload extends SpecialPage {
                $desiredTitleObj = Title::makeTitleSafe( NS_FILE, $this->mDesiredDestName );
                $delNotice = ''; // empty by default
                if ( $desiredTitleObj instanceof Title && !$desiredTitleObj->exists() ) {
+                       $dbr = wfGetDB( DB_REPLICA );
+
                        LogEventsList::showLogExtract( $delNotice, [ 'delete', 'move' ],
                                $desiredTitleObj,
                                '', [ 'lim' => 10,
-                                       'conds' => [ "log_action != 'revision'" ],
+                                       'conds' => [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ],
                                        'showIfEmpty' => false,
                                        'msgKey' => [ 'upload-recreate-warning' ] ]
                        );
@@ -1090,12 +1092,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' );
+                               }
                        }
                }
 
@@ -1118,7 +1122,7 @@ class UploadForm extends HTMLForm {
                                        ? 'filereuploadsummary'
                                        : 'fileuploadsummary',
                                'default' => $this->mComment,
-                               'cols' => $this->getUser()->getIntOption( 'cols' ),
+                               'cols' => 80,
                                'rows' => 8,
                        ]
                ];
index 8478e94..b0bb595 100644 (file)
@@ -327,7 +327,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                header( "Content-Type: $contentType", true );
                header( 'Content-Transfer-Encoding: binary', true );
                header( 'Expires: Sun, 17-Jan-2038 19:14:07 GMT', true );
-               // Bug 53032 - It shouldn't be a problem here, but let's be safe and not cache
+               // T55032 - It shouldn't be a problem here, but let's be safe and not cache
                header( 'Cache-Control: private' );
                header( "Content-Length: $size", true );
        }
index c067f44..a9b732e 100644 (file)
@@ -38,7 +38,7 @@ class SpecialUserLogout extends UnlistedSpecialPage {
        function execute( $par ) {
                /**
                 * Some satellite ISPs use broken precaching schemes that log people out straight after
-                * they're logged in (bug 17790). Luckily, there's a way to detect such requests.
+                * they're logged in (T19790). Luckily, there's a way to detect such requests.
                 */
                if ( isset( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], '&amp;' ) !== false ) {
                        wfDebug( "Special:UserLogout request {$_SERVER['REQUEST_URI']} looks suspicious, denying.\n" );
index 38bac29..b33aa7d 100644 (file)
@@ -49,19 +49,25 @@ class UserrightsPage extends SpecialPage {
        }
 
        /**
-        * @param User $user
-        * @param bool $checkIfSelf
+        * Check whether the current user (from context) can change the target user's rights.
+        *
+        * @param User $targetUser User whose rights are being changed
+        * @param bool $checkIfSelf If false, assume that the current user can add/remove groups defined
+        *   in $wgGroupsAddToSelf / $wgGroupsRemoveFromSelf, without checking if it's the same as target
+        *   user
         * @return bool
         */
-       public function userCanChangeRights( $user, $checkIfSelf = true ) {
+       public function userCanChangeRights( $targetUser, $checkIfSelf = true ) {
+               $isself = $this->getUser()->equals( $targetUser );
+
                $available = $this->changeableGroups();
-               if ( $user->getId() == 0 ) {
+               if ( $targetUser->getId() == 0 ) {
                        return false;
                }
 
                return !empty( $available['add'] )
                        || !empty( $available['remove'] )
-                       || ( ( $this->isself || !$checkIfSelf ) &&
+                       || ( ( $isself || !$checkIfSelf ) &&
                                ( !empty( $available['add-self'] )
                                        || !empty( $available['remove-self'] ) ) );
        }
@@ -79,6 +85,8 @@ class UserrightsPage extends SpecialPage {
                $session = $request->getSession();
                $out = $this->getOutput();
 
+               $out->addModules( [ 'mediawiki.special.userrights' ] );
+
                if ( $par !== null ) {
                        $this->mTarget = $par;
                } else {
@@ -111,7 +119,6 @@ class UserrightsPage extends SpecialPage {
                        // Remove session data for the success message
                        $session->remove( 'specialUserrightsSaveSuccess' );
 
-                       $out->addModules( [ 'mediawiki.special.userrights' ] );
                        $out->addModuleStyles( 'mediawiki.notification.convertmessagebox.styles' );
                        $out->addHTML(
                                Html::rawElement(
@@ -163,8 +170,8 @@ class UserrightsPage extends SpecialPage {
                        }
 
                        $targetUser = $this->mFetchedUser;
-                       if ( $targetUser instanceof User ) { // UserRightsProxy doesn't have this method (bug 61252)
-                               $targetUser->clearInstanceCache(); // bug 38989
+                       if ( $targetUser instanceof User ) { // UserRightsProxy doesn't have this method (T63252)
+                               $targetUser->clearInstanceCache(); // T40989
                        }
 
                        if ( $request->getVal( 'conflictcheck-originalgroups' )
@@ -172,18 +179,22 @@ class UserrightsPage extends SpecialPage {
                        ) {
                                $out->addWikiMsg( 'userrights-conflict' );
                        } else {
-                               $this->saveUserGroups(
+                               $status = $this->saveUserGroups(
                                        $this->mTarget,
                                        $request->getVal( 'user-reason' ),
                                        $targetUser
                                );
 
-                               // Set session data for the success message
-                               $session->set( 'specialUserrightsSaveSuccess', 1 );
-
-                               $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>' );
+                               }
                        }
                }
 
@@ -197,6 +208,41 @@ class UserrightsPage extends SpecialPage {
                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 );
+       }
+
        /**
         * Save user groups changes in the database.
         * Data comes from the editUserGroupsForm() form function
@@ -204,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.
@@ -218,45 +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 = '', $tags = [] ) {
+       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 ) ) {
@@ -267,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();
@@ -286,25 +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, $tags );
+               // 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
+        * @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, $tags ) {
+       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() );
@@ -312,6 +454,8 @@ class UserrightsPage extends SpecialPage {
                $logEntry->setParameters( [
                        '4::oldgroups' => $oldGroups,
                        '5::newgroups' => $newGroups,
+                       'oldmetadata' => $oldUGMs,
+                       'newmetadata' => $newUGMs,
                ] );
                $logid = $logEntry->insert();
                if ( count( $tags ) ) {
@@ -335,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.
@@ -465,62 +609,51 @@ class UserrightsPage extends SpecialPage {
                );
        }
 
-       /**
-        * Go through used and available groups and return the ones that this
-        * form will be able to manipulate based on the current user's system
-        * permissions.
-        *
-        * @param array $groups List of groups the given user is in
-        * @return array Tuple of addable, then removable groups
-        */
-       protected function splitGroups( $groups ) {
-               list( $addable, $removable, $addself, $removeself ) = array_values( $this->changeableGroups() );
-
-               $removable = array_intersect(
-                       array_merge( $this->isself ? $removeself : [], $removable ),
-                       $groups
-               ); // Can't remove groups the user doesn't have
-               $addable = array_diff(
-                       array_merge( $this->isself ? $addself : [], $addable ),
-                       $groups
-               ); // Can't add groups the user does have
-
-               return [ $addable, $removable ];
-       }
-
        /**
         * Show the form to edit group memberships.
         *
         * @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 = '';
@@ -549,7 +682,8 @@ class UserrightsPage extends SpecialPage {
                        Linker::TOOL_LINKS_EMAIL /* Add "send e-mail" link */
                );
 
-               list( $groupCheckboxes, $canChangeAny ) = $this->groupCheckboxes( $groups, $user );
+               list( $groupCheckboxes, $canChangeAny ) =
+                       $this->groupCheckboxes( $groupMemberships, $user );
                $this->getOutput()->addHTML(
                        Xml::openElement(
                                'form',
@@ -615,26 +749,6 @@ class UserrightsPage extends SpecialPage {
                );
        }
 
-       /**
-        * 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.
@@ -646,8 +760,8 @@ 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 Array with 2 elements: the XHTML table element with checkxboes, and
         * whether any groups are changeable
@@ -656,28 +770,42 @@ class UserrightsPage extends SpecialPage {
                $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;
@@ -708,18 +836,110 @@ 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";
                }
@@ -802,4 +1022,3 @@ class UserrightsPage extends SpecialPage {
                return 'users';
        }
 }
-
index 272f074..708eced 100644 (file)
@@ -78,9 +78,16 @@ class SpecialVersion extends SpecialPage {
                // Now figure out what to do
                switch ( strtolower( $parts[0] ) ) {
                        case 'credits':
+                               $out->addModuleStyles( 'mediawiki.special.version' );
+
                                $wikiText = '{{int:version-credits-not-found}}';
                                if ( $extName === 'MediaWiki' ) {
                                        $wikiText = file_get_contents( $IP . '/CREDITS' );
+                                       // Put the contributor list into columns
+                                       $wikiText = str_replace(
+                                               [ '<!-- BEGIN CONTRIBUTOR LIST -->', '<!-- END CONTRIBUTOR LIST -->' ],
+                                               [ '<div class="mw-version-credits">', '</div>' ],
+                                               $wikiText );
                                } elseif ( ( $extNode !== null ) && isset( $extNode['path'] ) ) {
                                        $file = $this->getExtAuthorsFileName( dirname( $extNode['path'] ) );
                                        if ( $file ) {
index 74d5e5d..6d481f8 100644 (file)
@@ -83,7 +83,7 @@ class WantedFilesPage extends WantedQueryPage {
         * KLUGE: The results may contain false positives for files
         * that exist e.g. in a shared repo.  Setting this at least
         * keeps them from showing up as redlinks in the output, even
-        * if it doesn't fix the real problem (bug 6220).
+        * if it doesn't fix the real problem (T8220).
         *
         * @note could also have existing links here from broken file
         * redirects.
index 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 85ac2de..822648b 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * A special page that lists last changes made to the wiki,
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 efc51ef..ca1b7dc 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Pager
  */
 
+use Wikimedia\Rdbms\FakeResultWrapper;
+
 /**
  * Use TablePager for prettified output. We have to pretend that we're
  * getting data from a table when in fact not all of it comes from the database.
index a4124db..9a447ef 100644 (file)
@@ -23,6 +23,7 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 class BlockListPager extends TablePager {
 
index 345577d..7db90c1 100644 (file)
@@ -92,21 +92,24 @@ class CategoryPager extends AlphabeticPager {
        }
 
        public function getStartForm( $from ) {
-               return Xml::tags(
-                       'form',
-                       [ 'method' => 'get', 'action' => wfScript() ],
-                       Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
-                       Xml::fieldset(
-                               $this->msg( 'categories' )->text(),
-                               Xml::inputLabel(
-                                       $this->msg( 'categoriesfrom' )->text(),
-                                       'from', 'from', 20, $from, [ 'class' => 'mw-ui-input-inline' ] ) .
-                               ' ' .
-                               Html::submitButton(
-                                       $this->msg( 'categories-submit' )->text(),
-                                       [], [ 'mw-ui-progressive' ]
-                               )
-                       )
-               );
+               $formDescriptor = [
+                       'from' => [
+                               'type' => 'title',
+                               'namespace' => NS_CATEGORY,
+                               'relative' => true,
+                               'label-message' => 'categoriesfrom',
+                               'name' => 'from',
+                               'id' => 'from',
+                               'size' => 20,
+                               'default' => $from,
+                       ],
+               ];
+
+               $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+                       ->setSubmitTextMsg( 'categories-submit' )
+                       ->setWrapperLegendMsg( 'categories' )
+                       ->setMethod( 'get' );
+               return $htmlForm->prepareForm()->getHTML( false );
        }
+
 }
index 39c55c8..5126bad 100644 (file)
@@ -24,6 +24,8 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 class ContribsPager extends ReverseChronologicalPager {
 
@@ -160,7 +162,7 @@ class ContribsPager extends ReverseChronologicalPager {
                $user = $this->getUser();
                $conds = array_merge( $userCond, $this->getNamespaceCond() );
 
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0';
                } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
@@ -200,7 +202,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;
        }
@@ -222,7 +226,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() )
                                        ]
                                ];
                        }
@@ -396,7 +404,7 @@ class ContribsPager extends ReverseChronologicalPager {
                                $difftext = $linkRenderer->makeKnownLink(
                                        $page,
                                        new HtmlArmor( $this->messages['diff'] ),
-                                       [],
+                                       [ 'class' => 'mw-changeslist-diff' ],
                                        [
                                                'diff' => 'prev',
                                                'oldid' => $row->rev_id
@@ -408,13 +416,13 @@ class ContribsPager extends ReverseChronologicalPager {
                        $histlink = $linkRenderer->makeKnownLink(
                                $page,
                                new HtmlArmor( $this->messages['hist'] ),
-                               [],
+                               [ 'class' => 'mw-changeslist-history' ],
                                [ 'action' => 'history' ]
                        );
 
                        if ( $row->rev_parent_id === null ) {
                                // For some reason rev_parent_id isn't populated for this row.
-                               // Its rumoured this is true on wikipedia for some revisions (bug 34922).
+                               // Its rumoured this is true on wikipedia for some revisions (T36922).
                                // Next best thing is to have the total number of bytes.
                                $chardiff = ' <span class="mw-changeslist-separator">. .</span> ';
                                $chardiff .= Linker::formatRevisionSize( $row->rev_len );
index 9ffcce9..a1f6b84 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 class DeletedContribsPager extends IndexPager {
 
@@ -59,7 +61,7 @@ class DeletedContribsPager extends IndexPager {
                list( $index, $userCond ) = $this->getUserCond();
                $conds = array_merge( $userCond, $this->getNamespaceCond() );
                $user = $this->getUser();
-               // Paranoia: avoid brute force searches (bug 17792)
+               // Paranoia: avoid brute force searches (T19792)
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::DELETED_USER ) . ' = 0';
                } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
index 59dea02..3789dfa 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 class ImageListPager extends TablePager {
 
@@ -449,7 +451,7 @@ class ImageListPager extends TablePager {
                                        $imgfile = $this->msg( 'imgfile' )->text();
                                }
 
-                               // Weird files can maybe exist? Bug 22227
+                               // Weird files can maybe exist? T24227
                                $filePage = Title::makeTitleSafe( NS_FILE, $value );
                                if ( $filePage ) {
                                        $link = $linkRenderer->makeKnownLink(
index 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 e22b939..4bf5dff 100644 (file)
@@ -59,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() )
                                        ]
                                ];
                        }
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 = [];
 
diff --git a/includes/specials/pagers/ProtectedPagesPager.php b/includes/specials/pagers/ProtectedPagesPager.php
new file mode 100644 (file)
index 0000000..45dced8
--- /dev/null
@@ -0,0 +1,335 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Pager
+ */
+
+use \MediaWiki\Linker\LinkRenderer;
+
+/**
+ * @todo document
+ */
+class ProtectedPagesPager extends TablePager {
+       public $mForm, $mConds;
+       private $type, $level, $namespace, $sizetype, $size, $indefonly, $cascadeonly, $noredirect;
+
+       /**
+        * @var LinkRenderer
+        */
+       private $linkRenderer;
+
+       /**
+        * @param SpecialProtectedpages $form
+        * @param array $conds
+        * @param $type
+        * @param $level
+        * @param $namespace
+        * @param string $sizetype
+        * @param int $size
+        * @param bool $indefonly
+        * @param bool $cascadeonly
+        * @param bool $noredirect
+        * @param LinkRenderer $linkRenderer
+        */
+       function __construct( $form, $conds = [], $type, $level, $namespace,
+               $sizetype = '', $size = 0, $indefonly = false, $cascadeonly = false, $noredirect = false,
+               LinkRenderer $linkRenderer
+       ) {
+               $this->mForm = $form;
+               $this->mConds = $conds;
+               $this->type = ( $type ) ? $type : 'edit';
+               $this->level = $level;
+               $this->namespace = $namespace;
+               $this->sizetype = $sizetype;
+               $this->size = intval( $size );
+               $this->indefonly = (bool)$indefonly;
+               $this->cascadeonly = (bool)$cascadeonly;
+               $this->noredirect = (bool)$noredirect;
+               $this->linkRenderer = $linkRenderer;
+               parent::__construct( $form->getContext() );
+       }
+
+       function preprocessResults( $result ) {
+               # Do a link batch query
+               $lb = new LinkBatch;
+               $userids = [];
+
+               foreach ( $result as $row ) {
+                       $lb->add( $row->page_namespace, $row->page_title );
+                       // field is nullable, maybe null on old protections
+                       if ( $row->log_user !== null ) {
+                               $userids[] = $row->log_user;
+                       }
+               }
+
+               // fill LinkBatch with user page and user talk
+               if ( count( $userids ) ) {
+                       $userCache = UserCache::singleton();
+                       $userCache->doQuery( $userids, [], __METHOD__ );
+                       foreach ( $userids as $userid ) {
+                               $name = $userCache->getProp( $userid, 'name' );
+                               if ( $name !== false ) {
+                                       $lb->add( NS_USER, $name );
+                                       $lb->add( NS_USER_TALK, $name );
+                               }
+                       }
+               }
+
+               $lb->execute();
+       }
+
+       function getFieldNames() {
+               static $headers = null;
+
+               if ( $headers == [] ) {
+                       $headers = [
+                               'log_timestamp' => 'protectedpages-timestamp',
+                               'pr_page' => 'protectedpages-page',
+                               'pr_expiry' => 'protectedpages-expiry',
+                               'log_user' => 'protectedpages-performer',
+                               'pr_params' => 'protectedpages-params',
+                               'log_comment' => 'protectedpages-reason',
+                       ];
+                       foreach ( $headers as $key => $val ) {
+                               $headers[$key] = $this->msg( $val )->text();
+                       }
+               }
+
+               return $headers;
+       }
+
+       /**
+        * @param string $field
+        * @param string $value
+        * @return string HTML
+        * @throws MWException
+        */
+       function formatValue( $field, $value ) {
+               /** @var $row object */
+               $row = $this->mCurrentRow;
+
+               switch ( $field ) {
+                       case 'log_timestamp':
+                               // when timestamp is null, this is a old protection row
+                               if ( $value === null ) {
+                                       $formatted = Html::rawElement(
+                                               'span',
+                                               [ 'class' => 'mw-protectedpages-unknown' ],
+                                               $this->msg( 'protectedpages-unknown-timestamp' )->escaped()
+                                       );
+                               } else {
+                                       $formatted = htmlspecialchars( $this->getLanguage()->userTimeAndDate(
+                                               $value, $this->getUser() ) );
+                               }
+                               break;
+
+                       case 'pr_page':
+                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+                               if ( !$title ) {
+                                       $formatted = Html::element(
+                                               'span',
+                                               [ 'class' => 'mw-invalidtitle' ],
+                                               Linker::getInvalidTitleDescription(
+                                                       $this->getContext(),
+                                                       $row->page_namespace,
+                                                       $row->page_title
+                                               )
+                                       );
+                               } else {
+                                       $formatted = $this->linkRenderer->makeLink( $title );
+                               }
+                               if ( !is_null( $row->page_len ) ) {
+                                       $formatted .= $this->getLanguage()->getDirMark() .
+                                               ' ' . Html::rawElement(
+                                                       'span',
+                                                       [ 'class' => 'mw-protectedpages-length' ],
+                                                       Linker::formatRevisionSize( $row->page_len )
+                                               );
+                               }
+                               break;
+
+                       case 'pr_expiry':
+                               $formatted = htmlspecialchars( $this->getLanguage()->formatExpiry(
+                                       $value, /* User preference timezone */true ) );
+                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+                               if ( $this->getUser()->isAllowed( 'protect' ) && $title ) {
+                                       $changeProtection = $this->linkRenderer->makeKnownLink(
+                                               $title,
+                                               $this->msg( 'protect_change' )->text(),
+                                               [],
+                                               [ 'action' => 'unprotect' ]
+                                       );
+                                       $formatted .= ' ' . Html::rawElement(
+                                                       'span',
+                                                       [ 'class' => 'mw-protectedpages-actions' ],
+                                                       $this->msg( 'parentheses' )->rawParams( $changeProtection )->escaped()
+                                               );
+                               }
+                               break;
+
+                       case 'log_user':
+                               // when timestamp is null, this is a old protection row
+                               if ( $row->log_timestamp === null ) {
+                                       $formatted = Html::rawElement(
+                                               'span',
+                                               [ 'class' => 'mw-protectedpages-unknown' ],
+                                               $this->msg( 'protectedpages-unknown-performer' )->escaped()
+                                       );
+                               } else {
+                                       $username = UserCache::singleton()->getProp( $value, 'name' );
+                                       if ( LogEventsList::userCanBitfield(
+                                               $row->log_deleted,
+                                               LogPage::DELETED_USER,
+                                               $this->getUser()
+                                       ) ) {
+                                               if ( $username === false ) {
+                                                       $formatted = htmlspecialchars( $value );
+                                               } else {
+                                                       $formatted = Linker::userLink( $value, $username )
+                                                               . Linker::userToolLinks( $value, $username );
+                                               }
+                                       } else {
+                                               $formatted = $this->msg( 'rev-deleted-user' )->escaped();
+                                       }
+                                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_USER ) ) {
+                                               $formatted = '<span class="history-deleted">' . $formatted . '</span>';
+                                       }
+                               }
+                               break;
+
+                       case 'pr_params':
+                               $params = [];
+                               // Messages: restriction-level-sysop, restriction-level-autoconfirmed
+                               $params[] = $this->msg( 'restriction-level-' . $row->pr_level )->escaped();
+                               if ( $row->pr_cascade ) {
+                                       $params[] = $this->msg( 'protect-summary-cascade' )->escaped();
+                               }
+                               $formatted = $this->getLanguage()->commaList( $params );
+                               break;
+
+                       case 'log_comment':
+                               // when timestamp is null, this is an old protection row
+                               if ( $row->log_timestamp === null ) {
+                                       $formatted = Html::rawElement(
+                                               'span',
+                                               [ 'class' => 'mw-protectedpages-unknown' ],
+                                               $this->msg( 'protectedpages-unknown-reason' )->escaped()
+                                       );
+                               } else {
+                                       if ( LogEventsList::userCanBitfield(
+                                               $row->log_deleted,
+                                               LogPage::DELETED_COMMENT,
+                                               $this->getUser()
+                                       ) ) {
+                                               $formatted = Linker::formatComment( $value !== null ? $value : '' );
+                                       } else {
+                                               $formatted = $this->msg( 'rev-deleted-comment' )->escaped();
+                                       }
+                                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
+                                               $formatted = '<span class="history-deleted">' . $formatted . '</span>';
+                                       }
+                               }
+                               break;
+
+                       default:
+                               throw new MWException( "Unknown field '$field'" );
+               }
+
+               return $formatted;
+       }
+
+       function getQueryInfo() {
+               $conds = $this->mConds;
+               $conds[] = 'pr_expiry > ' . $this->mDb->addQuotes( $this->mDb->timestamp() ) .
+                       ' OR pr_expiry IS NULL';
+               $conds[] = 'page_id=pr_page';
+               $conds[] = 'pr_type=' . $this->mDb->addQuotes( $this->type );
+
+               if ( $this->sizetype == 'min' ) {
+                       $conds[] = 'page_len>=' . $this->size;
+               } elseif ( $this->sizetype == 'max' ) {
+                       $conds[] = 'page_len<=' . $this->size;
+               }
+
+               if ( $this->indefonly ) {
+                       $infinity = $this->mDb->addQuotes( $this->mDb->getInfinity() );
+                       $conds[] = "pr_expiry = $infinity OR pr_expiry IS NULL";
+               }
+               if ( $this->cascadeonly ) {
+                       $conds[] = 'pr_cascade = 1';
+               }
+               if ( $this->noredirect ) {
+                       $conds[] = 'page_is_redirect = 0';
+               }
+
+               if ( $this->level ) {
+                       $conds[] = 'pr_level=' . $this->mDb->addQuotes( $this->level );
+               }
+               if ( !is_null( $this->namespace ) ) {
+                       $conds[] = 'page_namespace=' . $this->mDb->addQuotes( $this->namespace );
+               }
+
+               return [
+                       'tables' => [ 'page', 'page_restrictions', 'log_search', 'logging' ],
+                       'fields' => [
+                               'pr_id',
+                               'page_namespace',
+                               'page_title',
+                               'page_len',
+                               'pr_type',
+                               'pr_level',
+                               'pr_expiry',
+                               'pr_cascade',
+                               'log_timestamp',
+                               'log_user',
+                               'log_comment',
+                               'log_deleted',
+                       ],
+                       'conds' => $conds,
+                       'join_conds' => [
+                               'log_search' => [
+                                       'LEFT JOIN', [
+                                               'ls_field' => 'pr_id', 'ls_value = ' . $this->mDb->buildStringCast( 'pr_id' )
+                                       ]
+                               ],
+                               'logging' => [
+                                       'LEFT JOIN', [
+                                               'ls_log_id = log_id'
+                                       ]
+                               ]
+                       ]
+               ];
+       }
+
+       protected function getTableClass() {
+               return parent::getTableClass() . ' mw-protectedpages';
+       }
+
+       function getIndexField() {
+               return 'pr_id';
+       }
+
+       function getDefaultSort() {
+               return 'pr_id';
+       }
+
+       function isFieldSortable( $field ) {
+               // no index for sorting exists
+               return false;
+       }
+}
index 901be38..d599599 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 != '' ) {
@@ -161,7 +164,7 @@ class UsersPager extends AlphabeticPager {
         * @return string
         */
        function formatRow( $row ) {
-               if ( $row->user_id == 0 ) { # Bug 16487
+               if ( $row->user_id == 0 ) { # T18487
                        return '';
                }
 
@@ -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..3467b49 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.
@@ -1821,7 +1824,7 @@ class Balancer {
         * Regex borrowed from Tim Starling's "remex-html" project.
         */
        const VALID_COMMENT_REGEX = "~ !--
-               (                             # 1. Comment match detector
+               (                           # 1. Comment match detector
                        > | -> | # Invalid short close
                        (                         # 2. Comment contents
                                (?:
@@ -1836,15 +1839,15 @@ class Balancer {
                        (                         # 3. Comment close
                                --> |   # Normal close
                                --!> |  # Comment end bang
-                               (                     # 4. Indicate matches requiring EOF
-                                       --! |   # EOF in comment end bang state
-                                       -- |    # EOF in comment end state
-                                       -  |    # EOF in comment end dash state
-                                               # EOF in comment state
+                               (                       # 4. Indicate matches requiring EOF
+                                       --! |                   # EOF in comment end bang state
+                                       -- |                    # EOF in comment end state
+                                       -  |                    # EOF in comment end dash state
+                                       (?#nothing)             # EOF in comment state
                                )
                        )
                )
-               ([^<]*) \z                    # 5. Non-tag text after the comment
+               ([^<]*) \z                  # 5. Non-tag text after the comment
                ~xs";
 
        /**
@@ -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' ) ) {
diff --git a/includes/tidy/RemexCompatFormatter.php b/includes/tidy/RemexCompatFormatter.php
new file mode 100644 (file)
index 0000000..3dc727b
--- /dev/null
@@ -0,0 +1,71 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+use RemexHtml\HTMLData;
+use RemexHtml\Serializer\HtmlFormatter;
+use RemexHtml\Serializer\SerializerNode;
+use RemexHtml\Tokenizer\PlainAttributes;
+
+/**
+ * @internal
+ */
+class RemexCompatFormatter extends HtmlFormatter {
+       private static $markedEmptyElements = [
+               'li' => true,
+               'p' => true,
+               'tr' => true,
+       ];
+
+       public function __construct( $options = [] ) {
+               parent::__construct( $options );
+               $this->attributeEscapes["\xc2\xa0"] = '&#160;';
+               unset( $this->attributeEscapes["&"] );
+               $this->textEscapes["\xc2\xa0"] = '&#160;';
+               unset( $this->textEscapes["&"] );
+       }
+
+       public function startDocument( $fragmentNamespace, $fragmentName ) {
+               return '';
+       }
+
+       public function element( SerializerNode $parent, SerializerNode $node, $contents ) {
+               $data = $node->snData;
+               if ( $data && $data->isPWrapper ) {
+                       if ( $data->nonblankNodeCount ) {
+                               return "<p>$contents</p>";
+                       } else {
+                               return $contents;
+                       }
+               }
+
+               $name = $node->name;
+               $attrs = $node->attrs;
+               if ( isset( self::$markedEmptyElements[$name] ) && $attrs->count() === 0 ) {
+                       if ( strspn( $contents, "\t\n\f\r " ) === strlen( $contents ) ) {
+                               return "<{$name} class=\"mw-empty-elt\">$contents</{$name}>";
+                       }
+               }
+
+               $s = "<$name";
+               foreach ( $attrs->getValues() as $attrName => $attrValue ) {
+                       $encValue = strtr( $attrValue, $this->attributeEscapes );
+                       $s .= " $attrName=\"$encValue\"";
+               }
+               if ( $node->namespace === HTMLData::NS_HTML && isset( $this->voidElements[$name] ) ) {
+                       $s .= ' />';
+                       return $s;
+               }
+
+               $s .= '>';
+               if ( $node->namespace === HTMLData::NS_HTML
+                       && isset( $contents[0] ) && $contents[0] === "\n"
+                       && isset( $this->prefixLfElements[$name] )
+               ) {
+                       $s .= "\n$contents</$name>";
+               } else {
+                       $s .= "$contents</$name>";
+               }
+               return $s;
+       }
+}
diff --git a/includes/tidy/RemexCompatMunger.php b/includes/tidy/RemexCompatMunger.php
new file mode 100644 (file)
index 0000000..d5f5c28
--- /dev/null
@@ -0,0 +1,468 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+use RemexHtml\HTMLData;
+use RemexHtml\Serializer\Serializer;
+use RemexHtml\Serializer\SerializerNode;
+use RemexHtml\Tokenizer\Attributes;
+use RemexHtml\Tokenizer\PlainAttributes;
+use RemexHtml\TreeBuilder\TreeBuilder;
+use RemexHtml\TreeBuilder\TreeHandler;
+use RemexHtml\TreeBuilder\Element;
+
+/**
+ * @internal
+ */
+class RemexCompatMunger implements TreeHandler {
+       private static $onlyInlineElements = [
+               "a" => true,
+               "abbr" => true,
+               "acronym" => true,
+               "applet" => true,
+               "b" => true,
+               "basefont" => true,
+               "bdo" => true,
+               "big" => true,
+               "br" => true,
+               "button" => true,
+               "cite" => true,
+               "code" => true,
+               "dfn" => true,
+               "em" => true,
+               "font" => true,
+               "i" => true,
+               "iframe" => true,
+               "img" => true,
+               "input" => true,
+               "kbd" => true,
+               "label" => true,
+               "legend" => true,
+               "map" => true,
+               "object" => true,
+               "param" => true,
+               "q" => true,
+               "rb" => true,
+               "rbc" => true,
+               "rp" => true,
+               "rt" => true,
+               "rtc" => true,
+               "ruby" => true,
+               "s" => true,
+               "samp" => true,
+               "select" => true,
+               "small" => true,
+               "span" => true,
+               "strike" => true,
+               "strong" => true,
+               "sub" => true,
+               "sup" => true,
+               "textarea" => true,
+               "tt" => true,
+               "u" => true,
+               "var" => true,
+       ];
+
+       private static $formattingElements = [
+               'a' => true,
+               'b' => true,
+               'big' => true,
+               'code' => true,
+               'em' => true,
+               'font' => true,
+               'i' => true,
+               'nobr' => true,
+               's' => true,
+               'small' => true,
+               'strike' => true,
+               'strong' => true,
+               'tt' => true,
+               'u' => true,
+       ];
+
+       /**
+        * Constructor
+        *
+        * @param Serializer $serializer
+        */
+       public function __construct( Serializer $serializer ) {
+               $this->serializer = $serializer;
+       }
+
+       public function startDocument( $fragmentNamespace, $fragmentName ) {
+               $this->serializer->startDocument( $fragmentNamespace, $fragmentName );
+               $root = $this->serializer->getRootNode();
+               $root->snData = new RemexMungerData;
+               $root->snData->needsPWrapping = true;
+       }
+
+       public function endDocument( $pos ) {
+               $this->serializer->endDocument( $pos );
+       }
+
+       private function getParentForInsert( $preposition, $refElement ) {
+               if ( $preposition === TreeBuilder::ROOT ) {
+                       return [ $this->serializer->getRootNode(), null ];
+               } elseif ( $preposition === TreeBuilder::BEFORE ) {
+                       $refNode = $refElement->userData;
+                       return [ $this->serializer->getParentNode( $refNode ), $refNode ];
+               } else {
+                       $refNode = $refElement->userData;
+                       $refData = $refNode->snData;
+                       if ( $refData->currentCloneElement ) {
+                               // Follow a chain of clone links if necessary
+                               $origRefData = $refData;
+                               while ( $refData->currentCloneElement ) {
+                                       $refElement = $refData->currentCloneElement;
+                                       $refNode = $refElement->userData;
+                                       $refData = $refNode->snData;
+                               }
+                               // Cache the end of the chain in the requested element
+                               $origRefData->currentCloneElement = $refElement;
+                       } elseif ( $refData->childPElement ) {
+                               $refElement = $refData->childPElement;
+                               $refNode = $refElement->userData;
+                       }
+                       return [ $refNode, $refNode ];
+               }
+       }
+
+       /**
+        * Insert a p-wrapper
+        *
+        * @param SerializerNode $parent
+        * @param integer $sourceStart
+        * @return SerializerNode
+        */
+       private function insertPWrapper( SerializerNode $parent, $sourceStart ) {
+               $pWrap = new Element( HTMLData::NS_HTML, 'mw:p-wrap', new PlainAttributes );
+               $this->serializer->insertElement( TreeBuilder::UNDER, $parent, $pWrap, false,
+                       $sourceStart, 0 );
+               $data = new RemexMungerData;
+               $data->isPWrapper = true;
+               $data->wrapBaseNode = $parent;
+               $pWrap->userData->snData = $data;
+               $parent->snData->childPElement = $pWrap;
+               return $pWrap->userData;
+       }
+
+       public function characters( $preposition, $refElement, $text, $start, $length,
+               $sourceStart, $sourceLength
+       ) {
+               $isBlank = strspn( $text, "\t\n\f\r ", $start, $length ) === $length;
+
+               list( $parent, $refNode ) = $this->getParentForInsert( $preposition, $refElement );
+               $parentData = $parent->snData;
+
+               if ( $preposition === TreeBuilder::UNDER ) {
+                       if ( $parentData->needsPWrapping && !$isBlank ) {
+                               // Add a p-wrapper for bare text under body/blockquote
+                               $refNode = $this->insertPWrapper( $refNode, $sourceStart );
+                               $parent = $refNode;
+                               $parentData = $parent->snData;
+                       } elseif ( $parentData->isSplittable && !$parentData->ancestorPNode ) {
+                               // The parent is splittable and in block mode, so split the tag stack
+                               $refNode = $this->splitTagStack( $refNode, true, $sourceStart );
+                               $parent = $refNode;
+                               $parentData = $parent->snData;
+                       }
+               }
+
+               if ( !$isBlank ) {
+                       // Non-whitespace characters detected
+                       $parentData->nonblankNodeCount++;
+               }
+               $this->serializer->characters( $preposition, $refNode, $text, $start,
+                       $length, $sourceStart, $sourceLength );
+       }
+
+       /**
+        * Insert or reparent an element. Create p-wrappers or split the tag stack
+        * as necessary.
+        *
+        * Consider the following insertion locations. The parent may be:
+        *
+        *   - A: A body or blockquote (!!needsPWrapping)
+        *   - B: A p-wrapper (!!isPWrapper)
+        *   - C: A descendant of a p-wrapper (!!ancestorPNode)
+        *     - CS: With splittable formatting elements in the stack region up to
+        *       the p-wrapper
+        *     - CU: With one or more unsplittable elements in the stack region up
+        *       to the p-wrapper
+        *   - D: Not a descendant of a p-wrapper (!ancestorNode)
+        *     - DS: With splittable formatting elements in the stack region up to
+        *       the body or blockquote
+        *     - DU: With one or more unsplittable elements in the stack region up
+        *       to the body or blockquote
+        *
+        * And consider that we may insert two types of element:
+        *   - b: block
+        *   - i: inline
+        *
+        * We handle the insertion as follows:
+        *
+        *   - A/i: Create a p-wrapper, insert under it
+        *   - A/b: Insert as normal
+        *   - B/i: Insert as normal
+        *   - B/b: Close the p-wrapper, insert under the body/blockquote (wrap
+        *     base) instead)
+        *   - C/i: Insert as normal
+        *   - CS/b: Split the tag stack, insert the block under cloned formatting
+        *     elements which have the wrap base (the parent of the p-wrap) as
+        *     their ultimate parent.
+        *   - CU/b: Disable the p-wrap, by reparenting the currently open child
+        *     of the p-wrap under the p-wrap's parent. Then insert the block as
+        *     normal.
+        *   - D/b: Insert as normal
+        *   - DS/i: Split the tag stack, creating a new p-wrapper as the ultimate
+        *     parent of the formatting elements thus cloned. The parent of the
+        *     p-wrapper is the body or blockquote.
+        *   - DU/i: Insert as normal
+        *
+        * FIXME: fostering ($preposition == BEFORE) is mostly done by inserting as
+        * normal, the full algorithm is not followed.
+        *
+        * @param integer $preposition
+        * @param Element|SerializerNode|null $refElement
+        * @param Element $element
+        * @param bool $void
+        * @param integer $sourceStart
+        * @param integer $sourceLength
+        */
+
+       public function insertElement( $preposition, $refElement, Element $element, $void,
+               $sourceStart, $sourceLength
+       ) {
+               list( $parent, $newRef ) = $this->getParentForInsert( $preposition, $refElement );
+               $parentData = $parent->snData;
+               $parentNs = $parent->namespace;
+               $parentName = $parent->name;
+               $elementName = $element->htmlName;
+
+               $inline = isset( self::$onlyInlineElements[$elementName] );
+               $under = $preposition === TreeBuilder::UNDER;
+
+               if ( $under && $parentData->isPWrapper && !$inline ) {
+                       // [B/b] The element is non-inline and the parent is a p-wrapper,
+                       // close the parent and insert into its parent instead
+                       $newParent = $this->serializer->getParentNode( $parent );
+                       $parent = $newParent;
+                       $parentData = $parent->snData;
+                       $parentData->childPElement = null;
+                       $newRef = $refElement->userData;
+                       // FIXME cannot call endTag() since we don't have an Element
+               } elseif ( $under && $parentData->isSplittable
+                       && (bool)$parentData->ancestorPNode !== $inline
+               ) {
+                       // [CS/b, DS/i] The parent is splittable and the current element is
+                       // inline in block context, or if the current element is a block
+                       // under a p-wrapper, split the tag stack.
+                       $newRef = $this->splitTagStack( $newRef, $inline, $sourceStart );
+                       $parent = $newRef;
+                       $parentData = $parent->snData;
+               } elseif ( $under && $parentData->needsPWrapping && $inline ) {
+                       // [A/i] If the element is inline and we are in body/blockquote,
+                       // we need to create a p-wrapper
+                       $newRef = $this->insertPWrapper( $newRef, $sourceStart );
+                       $parent = $newRef;
+                       $parentData = $parent->snData;
+               } elseif ( $parentData->ancestorPNode && !$inline ) {
+                       // [CU/b] If the element is non-inline and (despite attempting to
+                       // split above) there is still an ancestor p-wrap, disable that
+                       // p-wrap
+                       $this->disablePWrapper( $parent, $sourceStart );
+               }
+               // else [A/b, B/i, C/i, D/b, DU/i] insert as normal
+
+               // An element with element children is a non-blank element
+               $parentData->nonblankNodeCount++;
+
+               // Insert the element downstream and so initialise its userData
+               $this->serializer->insertElement( $preposition, $newRef,
+                       $element, $void, $sourceStart, $sourceLength );
+
+               // Initialise snData
+               if ( !$element->userData->snData ) {
+                       $elementData = $element->userData->snData = new RemexMungerData;
+               } else {
+                       $elementData = $element->userData->snData;
+               }
+               if ( ( $parentData->isPWrapper || $parentData->isSplittable )
+                       && isset( self::$formattingElements[$elementName] )
+               ) {
+                       $elementData->isSplittable = true;
+               }
+               if ( $parentData->isPWrapper ) {
+                       $elementData->ancestorPNode = $parent;
+               } elseif ( $parentData->ancestorPNode ) {
+                       $elementData->ancestorPNode = $parentData->ancestorPNode;
+               }
+               if ( $parentData->wrapBaseNode ) {
+                       $elementData->wrapBaseNode = $parentData->wrapBaseNode;
+               } elseif ( $parentData->needsPWrapping ) {
+                       $elementData->wrapBaseNode = $parent;
+               }
+               if ( $elementName === 'body'
+                       || $elementName === 'blockquote'
+                       || $elementName === 'html'
+               ) {
+                       $elementData->needsPWrapping = true;
+               }
+       }
+
+       /**
+        * Clone nodes in a stack range and return the new parent
+        *
+        * @param SerializerNode $parentNode
+        * @param bool $inline
+        * @param integer $pos The source position
+        * @return SerializerNode
+        */
+       private function splitTagStack( SerializerNode $parentNode, $inline, $pos ) {
+               $parentData = $parentNode->snData;
+               $wrapBase = $parentData->wrapBaseNode;
+               $pWrap = $parentData->ancestorPNode;
+               if ( !$pWrap ) {
+                       $cloneEnd = $wrapBase;
+               } else {
+                       $cloneEnd = $parentData->ancestorPNode;
+               }
+
+               $serializer = $this->serializer;
+               $node = $parentNode;
+               $root = $serializer->getRootNode();
+               $nodes = [];
+               $removableNodes = [];
+               $haveContent = false;
+               while ( $node !== $cloneEnd ) {
+                       $nextParent = $serializer->getParentNode( $node );
+                       if ( $nextParent === $root ) {
+                               throw new \Exception( 'Did not find end of clone range' );
+                       }
+                       $nodes[] = $node;
+                       if ( $node->snData->nonblankNodeCount === 0 ) {
+                               $removableNodes[] = $node;
+                               $nextParent->snData->nonblankNodeCount--;
+                       }
+                       $node = $nextParent;
+               }
+
+               if ( $inline ) {
+                       $pWrap = $this->insertPWrapper( $wrapBase, $pos );
+                       $node = $pWrap;
+               } else {
+                       if ( $pWrap ) {
+                               // End the p-wrap which was open, cancel the diversion
+                               $wrapBase->snData->childPElement = null;
+                       }
+                       $pWrap = null;
+                       $node = $wrapBase;
+               }
+
+               for ( $i = count( $nodes ) - 1; $i >= 0; $i-- ) {
+                       $oldNode = $nodes[$i];
+                       $oldData = $oldNode->snData;
+                       $nodeParent = $node;
+                       $element = new Element( $oldNode->namespace, $oldNode->name, $oldNode->attrs );
+                       $this->serializer->insertElement( TreeBuilder::UNDER, $nodeParent,
+                               $element, false, $pos, 0 );
+                       $oldData->currentCloneElement = $element;
+
+                       $newNode = $element->userData;
+                       $newData = $newNode->snData = new RemexMungerData;
+                       if ( $pWrap ) {
+                               $newData->ancestorPNode = $pWrap;
+                       }
+                       $newData->isSplittable = true;
+                       $newData->wrapBaseNode = $wrapBase;
+                       $newData->isPWrapper = $oldData->isPWrapper;
+
+                       $nodeParent->snData->nonblankNodeCount++;
+
+                       $node = $newNode;
+               }
+               foreach ( $removableNodes as $rNode ) {
+                       $fakeElement = new Element( $rNode->namespace, $rNode->name, $rNode->attrs );
+                       $fakeElement->userData = $rNode;
+                       $this->serializer->removeNode( $fakeElement, $pos );
+               }
+               return $node;
+       }
+
+       /**
+        * Find the ancestor of $node which is a child of a p-wrapper, and
+        * reparent that node so that it is placed after the end of the p-wrapper
+        */
+       private function disablePWrapper( SerializerNode $node, $sourceStart ) {
+               $nodeData = $node->snData;
+               $pWrapNode = $nodeData->ancestorPNode;
+               $newParent = $this->serializer->getParentNode( $pWrapNode );
+               if ( $pWrapNode !== $this->serializer->getLastChild( $newParent ) ) {
+                       // Fostering or something? Abort!
+                       return;
+               }
+
+               $nextParent = $node;
+               do {
+                       $victim = $nextParent;
+                       $victim->snData->ancestorPNode = null;
+                       $nextParent = $this->serializer->getParentNode( $victim );
+               } while ( $nextParent !== $pWrapNode );
+
+               // Make a fake Element to use in a reparenting operation
+               $victimElement = new Element( $victim->namespace, $victim->name, $victim->attrs );
+               $victimElement->userData = $victim;
+
+               // Reparent
+               $this->serializer->insertElement( TreeBuilder::UNDER, $newParent, $victimElement,
+                       false, $sourceStart, 0 );
+
+               // Decrement nonblank node count
+               $pWrapNode->snData->nonblankNodeCount--;
+
+               // Cancel the diversion so that no more elements are inserted under this p-wrap
+               $newParent->snData->childPElement = null;
+       }
+
+       public function endTag( Element $element, $sourceStart, $sourceLength ) {
+               $this->serializer->endTag( $element, $sourceStart, $sourceLength );
+       }
+
+       public function doctype( $name, $public, $system, $quirks, $sourceStart, $sourceLength ) {
+               $this->serializer->doctype( $name, $public,  $system, $quirks,
+                       $sourceStart, $sourceLength );
+       }
+
+       public function comment( $preposition, $refElement, $text, $sourceStart, $sourceLength ) {
+               list( $parent, $refNode ) = $this->getParentForInsert( $preposition, $refElement );
+               $this->serializer->comment( $preposition, $refNode, $text,
+                       $sourceStart, $sourceLength );
+       }
+
+       public function error( $text, $pos ) {
+               $this->serializer->error( $text, $pos );
+       }
+
+       public function mergeAttributes( Element $element, Attributes $attrs, $sourceStart ) {
+               $this->serializer->mergeAttributes( $element, $attrs, $sourceStart );
+       }
+
+       public function removeNode( Element $element, $sourceStart ) {
+               $this->serializer->removeNode( $element, $sourceStart );
+       }
+
+       public function reparentChildren( Element $element, Element $newParent, $sourceStart ) {
+               $self = $element->userData;
+               $children = $self->children;
+               $self->children = [];
+               $this->insertElement( TreeBuilder::UNDER, $element, $newParent, false, $sourceStart, 0 );
+               $newParentNode = $newParent->userData;
+               $newParentId = $newParentNode->id;
+               foreach ( $children as $child ) {
+                       if ( is_object( $child ) ) {
+                               $child->parentId = $newParentId;
+                       }
+               }
+               $newParentNode->children = $children;
+       }
+}
diff --git a/includes/tidy/RemexDriver.php b/includes/tidy/RemexDriver.php
new file mode 100644 (file)
index 0000000..e02af88
--- /dev/null
@@ -0,0 +1,57 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+use RemexHtml\Serializer\Serializer;
+use RemexHtml\Tokenizer\Tokenizer;
+use RemexHtml\TreeBuilder\Dispatcher;
+use RemexHtml\TreeBuilder\TreeBuilder;
+use RemexHtml\TreeBuilder\TreeMutationTracer;
+
+class RemexDriver extends TidyDriverBase {
+       private $trace;
+       private $pwrap;
+
+       public function __construct( array $config ) {
+               $config += [
+                       'treeMutationTrace' => false,
+                       'pwrap' => true
+               ];
+               $this->trace = $config['treeMutationTrace'];
+               $this->pwrap = $config['pwrap'];
+               parent::__construct( $config );
+       }
+
+       public function tidy( $text ) {
+               $formatter = new RemexCompatFormatter;
+               $serializer = new Serializer( $formatter );
+               if ( $this->pwrap ) {
+                       $munger = new RemexCompatMunger( $serializer );
+               } else {
+                       $munger = $serializer;
+               }
+               if ( $this->trace ) {
+                       $tracer = new TreeMutationTracer( $munger, function ( $msg ) {
+                               wfDebug( "RemexHtml: $msg" );
+                       } );
+               } else {
+                       $tracer = $munger;
+               }
+               $treeBuilder = new TreeBuilder( $tracer, [
+                       'ignoreErrors' => true,
+                       'ignoreNulls' => true,
+               ] );
+               $dispatcher = new Dispatcher( $treeBuilder );
+               $tokenizer = new Tokenizer( $dispatcher, $text, [
+                       'ignoreErrors' => true,
+                       'ignoreCharRefs' => true,
+                       'ignoreNulls' => true,
+                       'skipPreprocess' => true,
+               ] );
+               $tokenizer->execute( [
+                       'fragmentNamespace' => \RemexHtml\HTMLData::NS_HTML,
+                       'fragmentName' => 'body'
+               ] );
+               return $serializer->getResult();
+       }
+}
diff --git a/includes/tidy/RemexMungerData.php b/includes/tidy/RemexMungerData.php
new file mode 100644 (file)
index 0000000..d614a38
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+/**
+ * @internal
+ */
+class RemexMungerData {
+       /**
+        * The Element for the mw:p-wrap which is a child of the current node. If
+        * this is set, inline insertions into this node will be diverted so that
+        * they insert into the p-wrap.
+        *
+        * @var \RemexHtml\TreeBuilder\Element|null
+        */
+       public $childPElement;
+
+       /**
+        * This tracks the mw:p-wrap node in the Serializer stack which is an
+        * ancestor of this node. If there is no mw:p-wrap ancestor, it is null.
+        *
+        * @var \RemexHtml\Serializer\SerializerNode|null
+        */
+       public $ancestorPNode;
+
+       /**
+        * The wrap base node is the body or blockquote node which is the parent
+        * of active p-wrappers. This is set if there is an ancestor p-wrapper,
+        * or if a p-wrapper was closed due to a block element being encountered
+        * inside it.
+        *
+        * @var \RemexHtml\Serializer\SerializerNode|null
+        */
+       public $wrapBaseNode;
+
+       /**
+        * Stack splitting (essentially our idea of AFE reconstruction) can clone
+        * formatting elements which are split over multiple paragraphs.
+        * TreeBuilder is not aware of the cloning, and continues to insert into
+        * the original element. This is set to the newer clone if this node was
+        * cloned, i.e. if there is an active diversion of the insertion location.
+        *
+        * @var \RemexHtml\TreeBuilder\Element|null
+        */
+       public $currentCloneElement;
+
+       /**
+        * Is the node a p-wrapper, with name mw:p-wrap?
+        *
+        * @var bool
+        */
+       public $isPWrapper = false;
+
+       /**
+        * Is the node splittable, i.e. a formatting element or a node with a
+        * formatting element ancestor which is under an active or deactivated
+        * p-wrapper.
+        *
+        * @var bool
+        */
+       public $isSplittable = false;
+
+       /**
+        * This is true if the node is a body or blockquote, which activates
+        * p-wrapping of child nodes.
+        */
+       public $needsPWrapping = false;
+
+       /**
+        * The number of child nodes, not counting whitespace-only text nodes or
+        * comments.
+        */
+       public $nonblankNodeCount = 0;
+
+       public function __set( $name, $value ) {
+               throw new \Exception( "Cannot set property \"$name\"" );
+       }
+}
index 96ee8c3..d3f9d48 100644 (file)
@@ -27,7 +27,7 @@ abstract class TidyDriverBase {
         * @return bool Whether the HTML is valid
         */
        public function validate( $text, &$errorStr ) {
-               throw new \MWException( get_class( $this ) . " does not support validate()" );
+               throw new \MWException( static::class . ' does not support validate()' );
        }
 
        /**
index 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 2d67a28..4d24cb8 100644 (file)
@@ -115,15 +115,23 @@ class NamespaceAwareForeignTitleFactory implements ForeignTitleFactory {
        protected function parseTitleWithNs( $title, $ns ) {
                $pieces = explode( ':', $title, 2 );
 
+               // Is $title of the form Namespace:Title (true), or just Title (false)?
+               $titleIncludesNamespace = ( $ns != '0' && count( $pieces ) === 2 );
+
                if ( isset( $this->foreignNamespaces[$ns] ) ) {
                        $namespaceName = $this->foreignNamespaces[$ns];
                } else {
-                       $namespaceName = $ns == '0' ? '' : $pieces[0];
+                       // If the foreign wiki is misconfigured, XML dumps can contain a page with
+                       // a non-zero namespace ID, but whose title doesn't contain a colon
+                       // (T114115). In those cases, output a made-up namespace name to avoid
+                       // collisions. The ImportTitleFactory might replace this with something
+                       // more appropriate.
+                       $namespaceName = $titleIncludesNamespace ? $pieces[0] : "Ns$ns";
                }
 
                // We assume that the portion of the page title before the colon is the
-               // namespace name, except in the case of namespace 0
-               if ( $ns != '0' ) {
+               // namespace name, except in the case of namespace 0.
+               if ( $titleIncludesNamespace ) {
                        $pageName = $pieces[1];
                } else {
                        $pageName = $title;
index 96f8638..733c4ff 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Upload
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * @defgroup Upload Upload related
@@ -297,7 +298,7 @@ abstract class UploadBase {
         * @param string $srcPath The source path
         * @return string|bool The real path if it was a virtual URL Returns false on failure
         */
-       function getRealPath( $srcPath ) {
+       public function getRealPath( $srcPath ) {
                $repo = RepoGroup::singleton()->getLocalRepo();
                if ( $repo->isVirtualUrl( $srcPath ) ) {
                        /** @todo Just make uploads work with storage paths UploadFromStash
@@ -560,7 +561,7 @@ abstract class UploadBase {
         *
         * @param array $entry
         */
-       function zipEntryCallback( $entry ) {
+       public function zipEntryCallback( $entry ) {
                $names = [ $entry['name'] ];
 
                // If there is a null character, cut off the name at it, because JDK's
@@ -895,7 +896,7 @@ abstract class UploadBase {
                        return $this->mTitle;
                }
 
-               // Windows may be broken with special characters, see bug 1780
+               // Windows may be broken with special characters, see T3780
                if ( !preg_match( '/^[\x0-\x7f]*$/', $nt->getText() )
                        && !RepoGroup::singleton()->getLocalRepo()->backendSupportsUnicodePaths()
                ) {
@@ -1209,7 +1210,7 @@ abstract class UploadBase {
                }
 
                // Some browsers will interpret obscure xml encodings as UTF-8, while
-               // PHP/expat will interpret the given encoding in the xml declaration (bug 47304)
+               // PHP/expat will interpret the given encoding in the xml declaration (T49304)
                if ( $extension == 'svg' || strpos( $mime, 'image/svg' ) === 0 ) {
                        if ( self::checkXMLEncodingMissmatch( $file ) ) {
                                return true;
@@ -1361,8 +1362,8 @@ abstract class UploadBase {
                        [ 'processing_instruction_handler' => 'UploadBase::checkSvgPICallback' ]
                );
                if ( $check->wellFormed !== true ) {
-                       // Invalid xml (bug 58553)
-                       // But only when non-partial (bug 65724)
+                       // Invalid xml (T60553)
+                       // But only when non-partial (T67724)
                        return $partial ? false : [ 'uploadinvalidxml' ];
                } elseif ( $check->filterMatch ) {
                        if ( $this->mSVGNSError ) {
@@ -1382,7 +1383,7 @@ abstract class UploadBase {
         * @return bool (true if the filter identified something bad)
         */
        public static function checkSvgPICallback( $target, $data ) {
-               // Don't allow external stylesheets (bug 57550)
+               // Don't allow external stylesheets (T59550)
                if ( preg_match( '/xml-stylesheet/i', $target ) ) {
                        return [ 'upload-scripted-pi-callback' ];
                }
@@ -1401,7 +1402,7 @@ abstract class UploadBase {
                list( $namespace, $strippedElement ) = $this->splitXmlNamespace( $element );
 
                // We specifically don't include:
-               // http://www.w3.org/1999/xhtml (bug 60771)
+               // http://www.w3.org/1999/xhtml (T62771)
                static $validNamespaces = [
                        '',
                        'adobe:ns:meta/',
@@ -1440,6 +1441,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.
@@ -2082,7 +2084,7 @@ abstract class UploadBase {
        public static function getSessionStatus( User $user, $statusKey ) {
                $key = wfMemcKey( 'uploadstatus', $user->getId() ?: md5( $user->getName() ), $statusKey );
 
-               return ObjectCache::getMainStashInstance()->get( $key );
+               return MediaWikiServices::getInstance()->getMainObjectStash()->get( $key );
        }
 
        /**
@@ -2098,7 +2100,7 @@ abstract class UploadBase {
        public static function setSessionStatus( User $user, $statusKey, $value ) {
                $key = wfMemcKey( 'uploadstatus', $user->getId() ?: md5( $user->getName() ), $statusKey );
 
-               $cache = ObjectCache::getMainStashInstance();
+               $cache = MediaWikiServices::getInstance()->getMainObjectStash();
                if ( $value === false ) {
                        $cache->delete( $key );
                } else {
index c1aef22..4ee256c 100644 (file)
@@ -176,7 +176,7 @@ class PasswordReset implements LoggerAwareInterface {
                $firstUser = $users[0];
 
                if ( !$firstUser instanceof User || !$firstUser->getId() ) {
-                       // Don't parse username as wikitext (bug 65501)
+                       // Don't parse username as wikitext (T67501)
                        return StatusValue::newFatal( wfMessage( 'nosuchuser', wfEscapeWikiText( $username ) ) );
                }
 
@@ -192,7 +192,7 @@ class PasswordReset implements LoggerAwareInterface {
                                wfEscapeWikiText( $firstUser->getName() ) ) );
                }
 
-               // We need to have a valid IP address for the hook, but per bug 18347, we should
+               // We need to have a valid IP address for the hook, but per T20347, we should
                // send the user's name if they're logged in.
                $ip = $performingUser->getRequest()->getIP();
                if ( !$ip ) {
index 562f0d1..0acdb55 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',
        ];
@@ -225,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;
        // @}
@@ -283,9 +288,7 @@ class User implements IDBAccessObject {
        /** @var array */
        public $mOptions;
 
-       /**
-        * @var WebRequest
-        */
+       /** @var WebRequest */
        private $mRequest;
 
        /** @var Block */
@@ -301,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;
 
@@ -467,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.
         *
@@ -934,7 +949,7 @@ class User implements IDBAccessObject {
 
                // Ensure that the username isn't longer than 235 bytes, so that
                // (at least for the builtin skins) user javascript and css files
-               // will work. (bug 23080)
+               // will work. (T25080)
                if ( strlen( $name ) > 235 ) {
                        wfDebugLog( 'username', __METHOD__ .
                                ": '$name' invalid due to length" );
@@ -1059,7 +1074,7 @@ class User implements IDBAccessObject {
                }
 
                // Clean up name according to title rules,
-               // but only when validation is requested (bug 12654)
+               // but only when validation is requested (T14654)
                $t = ( $validate !== false ) ?
                        Title::newFromText( $name, NS_USER ) : Title::makeTitle( NS_USER, $name );
                // Check for invalid titles
@@ -1137,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 ] );
        }
@@ -1249,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 {
@@ -1266,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;
@@ -1341,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'] );
@@ -1365,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 );
                }
        }
 
@@ -1508,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;
@@ -1581,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;
@@ -1614,29 +1637,9 @@ 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).
-                                       $tmpBlock->setCookie( $this->getRequest()->response(), true );
-                               }
-                       }
+               // Cookie blocking
+               if ( !$block instanceof Block ) {
+                       $block = $this->getBlockFromCookieValue( $this->getRequest()->getCookie( 'BlockID' ) );
                }
 
                // Proxy blocking
@@ -1661,7 +1664,7 @@ class User implements IDBAccessObject {
                        }
                }
 
-               // (bug 23343) Apply IP blocks to the contents of XFF headers, if enabled
+               // (T25343) Apply IP blocks to the contents of XFF headers, if enabled
                if ( !$block instanceof Block
                        && $wgApplyIpBlocksToXff
                        && $ip !== null
@@ -1680,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;
@@ -1700,6 +1718,43 @@ class User implements IDBAccessObject {
                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;
+       }
+
        /**
         * Whether the given IP is in a DNS blacklist.
         *
@@ -1732,7 +1787,7 @@ class User implements IDBAccessObject {
                $found = false;
                // @todo FIXME: IPv6 ???  (https://bugs.php.net/bug.php?id=33170)
                if ( IP::isIPv4( $ip ) ) {
-                       // Reverse IP, bug 21255
+                       // Reverse IP, T23255
                        $ipReversed = implode( '.', array_reverse( explode( '.', $ip ) ) );
 
                        foreach ( (array)$bases as $base ) {
@@ -1807,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.
@@ -3206,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;
        }
 
        /**
@@ -3317,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 ( $expiry ) {
+                       $expiry = wfTimestamp( TS_MW, $expiry );
+               }
 
-               if ( !Hooks::run( 'UserAddGroup', [ $this, &$group ] ) ) {
+               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().
@@ -3364,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().
@@ -3711,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
@@ -4030,7 +4125,7 @@ class User implements IDBAccessObject {
         *   }
         *   // do something with $user...
         *
-        * However, this was vulnerable to a race condition (bug 16020). By
+        * However, this was vulnerable to a race condition (T18020). By
         * initialising the user object if the user exists, we aim to support this
         * calling sequence as far as possible.
         *
@@ -4143,7 +4238,7 @@ class User implements IDBAccessObject {
                        return $this->mBlock;
                }
 
-               # bug 13611: if the IP address the user is trying to create an account from is
+               # T15611: if the IP address the user is trying to create an account from is
                # blocked with createaccount disabled, prevent new account creation there even
                # when the user is logged in
                if ( $this->mBlockedFromCreateAccount === false && !$this->isAllowed( 'ipblock-exempt' ) ) {
@@ -4436,7 +4531,7 @@ class User implements IDBAccessObject {
         * @note Since these URLs get dropped directly into emails, using the
         * short English names avoids insanely long URL-encoded links, which
         * also sometimes can get corrupted in some browsers/mailers
-        * (bug 6957 with Gmail and Internet Explorer).
+        * (T8957 with Gmail and Internet Explorer).
         *
         * @param string $page Special page
         * @param string $token Token
@@ -4720,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 );
        }
 
        /**
@@ -4788,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 {
@@ -4826,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]]";
@@ -5075,54 +5175,6 @@ class User implements IDBAccessObject {
                return $msg->isDisabled() ? $grant : $msg->text();
        }
 
-       /**
-        * Make a new-style password hash
-        *
-        * @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
-        */
-       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 );
-       }
-
        /**
         * Add a newuser log entry for this user.
         * Before 1.19 the return value was always true.
@@ -5339,7 +5391,7 @@ class User implements IDBAccessObject {
                # Note that the pattern requirement will always be satisfied if the
                # input is empty, so we need required in all cases.
 
-               # @todo FIXME: Bug 23769: This needs to not claim the password is required
+               # @todo FIXME: T25769: This needs to not claim the password is required
                # if e-mail confirmation is being used.  Since HTML5 input validation
                # is b0rked anyway in some browsers, just return nothing.  When it's
                # re-enabled, fix this code to not output required for e-mail
@@ -5395,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 ) );
index dddc850..ab6683b 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 abstract class UserArray implements Iterator {
        /**
         * @param ResultWrapper $res
@@ -38,7 +40,7 @@ abstract class UserArray implements Iterator {
 
        /**
         * @param array $ids
-        * @return UserArrayFromResult
+        * @return UserArrayFromResult|ArrayIterator
         */
        static function newFromIDs( $ids ) {
                $ids = array_map( 'intval', (array)$ids ); // paranoia
@@ -59,7 +61,7 @@ abstract class UserArray implements Iterator {
        /**
         * @since 1.25
         * @param array $names
-        * @return UserArrayFromResult
+        * @return UserArrayFromResult|ArrayIterator
         */
        static function newFromNames( $names ) {
                $names = array_map( 'strval', (array)$names ); // paranoia
index fb533d0..527df7f 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 class UserArrayFromResult extends UserArray implements Countable {
        /** @var ResultWrapper */
        public $res;
@@ -27,7 +29,7 @@ class UserArrayFromResult extends UserArray implements Countable {
        /** @var int */
        public $key;
 
-       /** @var bool|stdClass */
+       /** @var bool|User */
        public $current;
 
        /**
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..1dac0b1 100644 (file)
@@ -152,7 +152,7 @@ class AutoloadGenerator {
                ksort( $json[$key] );
 
                // Return the whole JSON file
-               return FormatJson::encode( $json, true ) . "\n";
+               return FormatJson::encode( $json, "\t", FormatJson::ALL_OK ) . "\n";
        }
 
        /**
@@ -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,58 @@ 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;
+                               } elseif ( !is_array( $token ) || (
+                                       $token[0] !== T_STRING &&
+                                       $token[0] !== T_DOUBLE_COLON &&
+                                       $token[0] !== T_CLASS &&
+                                       $token[0] !== T_WHITESPACE
+                               ) ) {
+                                       // Ignore this call to class_alias() - compat/Timestamp.php
+                                       $this->alias = null;
+                                       $this->startToken = null;
+                               }
+                       }
+                       break;
+
                case T_CLASS:
                case T_INTERFACE:
                case T_TRAIT:
index ef2c14a..43bccba 100644 (file)
@@ -230,7 +230,7 @@ class BatchRowIterator implements RecursiveIterator {
         * `=` conditions while the final key uses a `>` condition
         *
         * Example output:
-        *        [ '( foo = 42 AND bar > 7 ) OR ( foo > 42 )' ]
+        *     [ '( foo = 42 AND bar > 7 ) OR ( foo > 42 )' ]
         *
         * @return array The SQL conditions necessary to select the next set
         *  of rows in the batched query
index 3bddd77..1c8d486 100644 (file)
@@ -47,11 +47,11 @@ class MWCryptHKDF {
         * From http://eprint.iacr.org/2010/264.pdf:
         *
         * The scheme HKDF is specifed as:
-        *      HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
+        *   HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
         * where the values K(i) are defined as follows:
-        *      PRK = HMAC(XTS, SKM)
-        *      K(1) = HMAC(PRK, CTXinfo || 0);
-        *      K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
+        *   PRK = HMAC(XTS, SKM)
+        *   K(1) = HMAC(PRK, CTXinfo || 0);
+        *   K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
         * where t = [L/k] and the value K(t) is truncated to its first d = L mod k bits;
         * the counter i is non-wrapping and of a given fixed size, e.g., a single byte.
         * Note that the length of the HMAC output is the same as its key length and therefore
index 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..a7407a0
--- /dev/null
@@ -0,0 +1,312 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use Hooks;
+use Html;
+use MediaWiki\Widget\SearchInputWidget;
+use MWNamespace;
+use SearchEngineConfig;
+use SpecialSearch;
+use Xml;
+
+class SearchFormWidget {
+       /** @var SpecialSearch */
+       protected $specialSearch;
+       /** @var SearchEngineConfig */
+       protected $searchConfig;
+       /** @var array */
+       protected $profiles;
+
+       /**
+        * @param SpecialSearch $specialSearch
+        * @param SearchEngineConfig $searchConfig
+        * @param array $profiles
+        */
+       public function __construct(
+               SpecialSearch $specialSearch,
+               SearchEngineConfig $searchConfig,
+               array $profiles
+       ) {
+               $this->specialSearch = $specialSearch;
+               $this->searchConfig = $searchConfig;
+               $this->profiles = $profiles;
+       }
+
+       /**
+        * @param string $profile The current search profile
+        * @param string $term The current search term
+        * @param int $numResults The number of results shown
+        * @param int $totalResults The total estimated results found
+        * @param int $offset Current offset in search results
+        * @param bool $isPowerSearch Is the 'advanced' section open?
+        * @return string HTML
+        */
+       public function render(
+               $profile,
+               $term,
+               $numResults,
+               $totalResults,
+               $offset,
+               $isPowerSearch
+       ) {
+               return Xml::openElement(
+                               'form',
+                               [
+                                       'id' => $isPowerSearch ? 'powersearch' : 'search',
+                                       'method' => 'get',
+                                       'action' => wfScript(),
+                               ]
+                       ) .
+                               '<div id="mw-search-top-table">' .
+                                       $this->shortDialogHtml( $profile, $term, $numResults, $totalResults, $offset ) .
+                               '</div>' .
+                               "<div class='mw-search-visualclear'></div>" .
+                               "<div class='mw-search-profile-tabs'>" .
+                                       $this->profileTabsHtml( $profile, $term ) .
+                                       "<div style='clear:both'></div>" .
+                               "</div>" .
+                               $this->optionsHtml( $term, $isPowerSearch, $profile ) .
+                       '</form>';
+       }
+
+       /**
+        * @param string $profile The current search profile
+        * @param string $term The current search term
+        * @param int $numResults The number of results shown
+        * @param int $totalResults The total estimated results found
+        * @param int $offset Current offset in search results
+        * @return string HTML
+        */
+       protected function shortDialogHtml( $profile, $term, $numResults, $totalResults, $offset ) {
+               $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 = '';
+
+               if ( $isPowerSearch ) {
+                       $html .= $this->powerSearchBox( $term, [] );
+               } else {
+                       $form = '';
+                       Hooks::run( 'SpecialSearchProfileForm', [
+                               $this->specialSearch, &$form, $profile, $term, []
+                       ] );
+                       $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 5bce76b..0672315 100644 (file)
@@ -415,10 +415,10 @@ class Language {
        function __construct() {
                $this->mConverter = new FakeConverter( $this );
                // Set the code to the name of the descendant
-               if ( get_class( $this ) == 'Language' ) {
+               if ( static::class === 'Language' ) {
                        $this->mCode = 'en';
                } else {
-                       $this->mCode = str_replace( '_', '-', strtolower( substr( get_class( $this ), 8 ) ) );
+                       $this->mCode = str_replace( '_', '-', strtolower( substr( static::class, 8 ) ) );
                }
                self::getLocalisationCache();
        }
@@ -2158,12 +2158,10 @@ class Language {
         * the date preference they're supposed to use, it should be used in
         * all children.
         *
-        *<code>
-        * function timeanddate([...], $format = true) {
-        *      $datePreference = $this->dateFormat($format);
-        * [...]
-        * }
-        *</code>
+        *     function timeanddate([...], $format = true) {
+        *       $datePreference = $this->dateFormat($format);
+        *       [...]
+        *     }
         *
         * @param int|string|bool $usePrefs If true, the user's preference is used
         *   if false, the site/language default is used
@@ -3286,14 +3284,14 @@ class Language {
        public function parseFormattedNumber( $number ) {
                $s = $this->digitTransformTable();
                if ( $s ) {
-                       // eliminate empty array values such as ''. (bug 64347)
+                       // eliminate empty array values such as ''. (T66347)
                        $s = array_filter( $s );
                        $number = strtr( $number, array_flip( $s ) );
                }
 
                $s = $this->separatorTransformTable();
                if ( $s ) {
-                       // eliminate empty array values such as ''. (bug 64347)
+                       // eliminate empty array values such as ''. (T66347)
                        $s = array_filter( $s );
                        $number = strtr( $number, array_flip( $s ) );
                }
@@ -3497,7 +3495,7 @@ class Language {
                                $string = $ellipsis . $string;
                        }
                }
-               # Do not truncate if the ellipsis makes the string longer/equal (bug 22181).
+               # Do not truncate if the ellipsis makes the string longer/equal (T24181).
                # This check is *not* redundant if $adjustLength, due to the single case where
                # LEN($ellipsis) > ABS($limit arg); $stringOriginal could be shorter than $string.
                if ( strlen( $string ) < strlen( $stringOriginal ) ) {
@@ -3975,10 +3973,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 ) {
@@ -3995,12 +3994,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.
@@ -4506,7 +4506,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 06fec44..7721015 100644 (file)
@@ -99,13 +99,13 @@ class LanguageConverter {
                        // '+' add rules for alltext
                        // 'E' the gave flags is error
                        // these flags above are reserved for program
-                       'A' => 'A',       // add rule for convert code (all text convert)
-                       'T' => 'T',       // title convert
-                       'R' => 'R',       // raw content
-                       'D' => 'D',       // convert description (subclass implement)
-                       '-' => '-',       // remove convert (not implement)
-                       'H' => 'H',       // add rule for convert code (but no display in placed code)
-                       'N' => 'N'        // current variant name
+                       'A' => 'A',   // add rule for convert code (all text convert)
+                       'T' => 'T',   // title convert
+                       'R' => 'R',   // raw content
+                       'D' => 'D',   // convert description (subclass implement)
+                       '-' => '-',   // remove convert (not implement)
+                       'H' => 'H',   // add rule for convert code (but no display in placed code)
+                       'N' => 'N',   // current variant name
                ];
                $this->mFlags = array_merge( $defaultflags, $flags );
                foreach ( $this->mVariants as $v ) {
@@ -357,10 +357,10 @@ class LanguageConverter {
                }
 
                /* we convert everything except:
-                  1. HTML markups (anything between < and >)
-                  2. HTML entities
-                  3. placeholders created by the parser
-               */
+                * 1. HTML markups (anything between < and >)
+                * 2. HTML entities
+                * 3. placeholders created by the parser
+                */
                $marker = '|' . Parser::MARKER_PREFIX . '[\-a-zA-Z0-9]+';
 
                // this one is needed when the text is inside an HTML markup
@@ -380,6 +380,7 @@ class LanguageConverter {
                $literalBlob = '';
 
                // Guard against delimiter nulls in the input
+               // (should never happen: see T159174)
                $text = str_replace( "\000", '', $text );
 
                $markupMatches = null;
@@ -489,7 +490,7 @@ class LanguageConverter {
        protected function applyManualConv( $convRule ) {
                // Use syntax -{T|zh-cn:TitleCN; zh-tw:TitleTw}- to custom
                // title conversion.
-               // Bug 24072: $mConvRuleTitle was overwritten by other manual
+               // T26072: $mConvRuleTitle was overwritten by other manual
                // rule(s) not for title, this breaks the title conversion.
                $newConvRuleTitle = $convRule->getTitle();
                if ( $newConvRuleTitle ) {
@@ -844,9 +845,8 @@ class LanguageConverter {
         * @throws MWException
         */
        function loadDefaultTables() {
-               $name = get_class( $this );
-
-               throw new MWException( "Must implement loadDefaultTables() method in class $name" );
+               $class = static::class;
+               throw new MWException( "Must implement loadDefaultTables() method in class $class" );
        }
 
        /**
@@ -1085,12 +1085,12 @@ class LanguageConverter {
                        // text should be splited by ";" only if a valid variant
                        // name exist after the markup, for example:
                        //  -{zh-hans:<span style="font-size:120%;">xxx</span>;zh-hant:\
-                       //      <span style="font-size:120%;">yyy</span>;}-
+                       //  <span style="font-size:120%;">yyy</span>;}-
                        // we should split it as:
                        //  [
-                       //        [0] => 'zh-hans:<span style="font-size:120%;">xxx</span>'
-                       //        [1] => 'zh-hant:<span style="font-size:120%;">yyy</span>'
-                       //        [2] => ''
+                       //    [0] => 'zh-hans:<span style="font-size:120%;">xxx</span>'
+                       //    [1] => 'zh-hant:<span style="font-size:120%;">yyy</span>'
+                       //    [2] => ''
                        //  ]
                        $pat = '/;\s*(?=';
                        foreach ( $this->mVariants as $variant ) {
index 858a7be..90e3751 100644 (file)
@@ -30,7 +30,7 @@
 class LanguageAr extends Language {
 
        /**
-        * Temporary hack for bug 9413: replace Arabic presentation forms with their
+        * Temporary hack for T11413: replace Arabic presentation forms with their
         * standard equivalents.
         *
         * @todo FIXME: This is language-specific for now only to avoid the negative
index 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',
index 76568c2..9ef53e5 100644 (file)
@@ -63,13 +63,11 @@ class LanguageKsh extends Language {
         *
         * Possible values for the type of genitive are:
         *      Sing, Iehr            prepositioned genitive = possessive dative
-        *      Vun, Fon, -omitted-   postpositioned genitive
-        *                                     = preposition "vun" with dative
+        *      Vun, Fon, -omitted-   postpositioned genitive = preposition "vun" with dative
         *
         * Values of case overrides & prepositions, in the order of preceedence:
         *      Sing, Iehr            possessive dative = prepositioned genitive
-        *      Vun, Fon              preposition "vun" with dative
-        *                                           = postpositioned genitive
+        *      Vun, Fon              preposition "vun" with dative = postpositioned genitive
         *      En, em                preposition "en" with dative
         *
         * Values for object gender specifiers of the possessive dative, or
index d1963e1..f4082af 100644 (file)
@@ -50,12 +50,12 @@ class LanguageLa extends Language {
                case 'genitive':
                        // only a few declensions, and even for those mostly the singular only
                        $in = [
-                               '/u[ms]$/',                     # 2nd declension singular
-                               '/ommunia$/',                   # 3rd declension neuter plural (partly)
-                               '/a$/',                         # 1st declension singular
+                               '/u[ms]$/',                          # 2nd declension singular
+                               '/ommunia$/',                        # 3rd declension neuter plural (partly)
+                               '/a$/',                              # 1st declension singular
                                '/libri$/', '/nuntii$/', '/datae$/', # 2nd declension plural (partly)
-                               '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
-                               '/es$/'                         # 5th declension singular
+                               '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
+                               '/es$/'                              # 5th declension singular
                        ];
                        $out = [
                                'i',
@@ -69,12 +69,12 @@ class LanguageLa extends Language {
                case 'accusative':
                        // only a few declensions, and even for those mostly the singular only
                        $in = [
-                               '/u[ms]$/',                     # 2nd declension singular
-                               '/a$/',                         # 1st declension singular
-                               '/ommuniam$/',              # 3rd declension neuter plural (partly)
+                               '/u[ms]$/',                          # 2nd declension singular
+                               '/a$/',                              # 1st declension singular
+                               '/ommuniam$/',                       # 3rd declension neuter plural (partly)
                                '/libri$/', '/nuntii$/', '/datam$/', # 2nd declension plural (partly)
-                               '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
-                               '/es$/'                         # 5th declension singular
+                               '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
+                               '/es$/'                              # 5th declension singular
                        ];
                        $out = [
                                'um',
@@ -88,12 +88,12 @@ class LanguageLa extends Language {
                case 'ablative':
                        // only a few declensions, and even for those mostly the singular only
                        $in = [
-                               '/u[ms]$/',                     # 2nd declension singular
-                               '/ommunia$/',                   # 3rd declension neuter plural (partly)
-                               '/a$/',                         # 1st declension singular
-                               '/libri$/', '/nuntii$/', '/data$/', # 2nd declension plural (partly)
-                               '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
-                               '/es$/'                         # 5th declension singular
+                               '/u[ms]$/',                          # 2nd declension singular
+                               '/ommunia$/',                        # 3rd declension neuter plural (partly)
+                               '/a$/',                              # 1st declension singular
+                               '/libri$/', '/nuntii$/', '/data$/',  # 2nd declension plural (partly)
+                               '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
+                               '/es$/'                              # 5th declension singular
                        ];
                        $out = [
                                'o',
index cd39378..df894a1 100644 (file)
@@ -31,8 +31,8 @@ class LanguageMl extends Language {
         * Temporary hack for the issue described at
         * http://permalink.gmane.org/gmane.science.linguistics.wikipedia.technical/46396
         * Convert Unicode 5.0 style Malayalam input to Unicode 5.1. Similar to
-        * bug 9413. Also fixes miscellaneous problems due to mishandling of ZWJ,
-        * e.g. bug 11162.
+        * T11413. Also fixes miscellaneous problems due to mishandling of ZWJ,
+        * e.g. T13162.
         *
         * @todo FIXME: This is language-specific for now only to avoid the negative
         * performance impact of enabling it for all languages.
index 42ee44d..49ee88a 100644 (file)
@@ -27,8 +27,7 @@
  * Turkish has two different i, one with a dot and another without a dot. They
  * are totally different letters in this language, so we have to override the
  * ucfirst and lcfirst methods.
- * See https://en.wikipedia.org/wiki/Dotted_and_dotless_I
- * and @bug 28040
+ * See https://en.wikipedia.org/wiki/Dotted_and_dotless_I and T30040
  * @ingroup Language
  */
 class LanguageTr extends Language {
index 0557455..1c350d0 100644 (file)
@@ -60,7 +60,7 @@ class Names {
                'als' => 'Alemannisch', # Alemannic -- not a valid code, for compatibility. See gsw.
                'am' => 'አማርኛ', # Amharic
                'an' => 'aragonés', # Aragonese
-               'ang' => 'Ænglisc', # Old English, bug 23283
+               'ang' => 'Ænglisc', # Old English, T25283
                'anp' => 'अङ्गिका', # Angika
                'ar' => 'العربية', # Arabic
                'arc' => 'ܐܪܡܝܐ', # Aramaic
@@ -274,7 +274,7 @@ class Names {
                'lus' => 'Mizo ţawng', # Mizo/Lushai
                'luz' => 'لئری دوٙمینی', # Southern Luri
                'lv' => 'latviešu', # Latvian
-               'lzh' => '文言', # Literary Chinese, bug 8217
+               'lzh' => '文言', # Literary Chinese, T10217
                'lzz' => 'Lazuri', # Laz
                'mai' => 'मैथिली', # Maithili
                'map-bms' => 'Basa Banyumasan', # Banyumasan
@@ -299,8 +299,8 @@ class Names {
                'mzn' => 'مازِرونی', # Mazanderani
                'na' => 'Dorerin Naoero', # Nauruan
                'nah' => 'Nāhuatl', # Nahuatl (not in ISO 639-3)
-               'nan' => 'Bân-lâm-gú', # Min-nan, bug 8217
-               'nap' => 'Napulitano', # Neapolitan, bug 43793
+               'nan' => 'Bân-lâm-gú', # Min-nan, T10217
+               'nap' => 'Napulitano', # Neapolitan, T45793
                'nb' => 'norsk bokmål', # Norwegian (Bokmal)
                'nds' => 'Plattdüütsch', # Low German ''or'' Low Saxon
                'nds-nl' => 'Nedersaksies', # aka Nedersaksisch: Dutch Low Saxon
@@ -321,7 +321,7 @@ class Names {
                'olo' => 'Livvinkarjala', # Livvi-Karelian
                'om' => 'Oromoo', # Oromo
                'or' => 'ଓଡ଼ିଆ', # Oriya
-               'os' => 'Ирон', # Ossetic, bug 29091
+               'os' => 'Ирон', # Ossetic, T31091
                'pa' => 'ਪੰਜਾਬੀ', # Eastern Punjabi (Gurmukhi script) (pan)
                'pag' => 'Pangasinan', # Pangasinan
                'pam' => 'Kapampangan', # Pampanga
@@ -456,17 +456,17 @@ class Names {
                'za' => 'Vahcuengh', # Zhuang
                'zea' => 'Zeêuws', # Zeeuws/Zeaws
                'zh' => '中文', # (Zhōng Wén) - Chinese
-               'zh-classical' => '文言', # Classical Chinese/Literary Chinese -- (see bug 8217)
+               'zh-classical' => '文言', # Classical Chinese/Literary Chinese -- (see T10217)
                'zh-cn' => "中文(中国大陆)\xE2\x80\x8E", # Chinese (PRC)
                'zh-hans' => "中文(简体)\xE2\x80\x8E", # Mandarin Chinese (Simplified Chinese script) (cmn-hans)
                'zh-hant' => "中文(繁體)\xE2\x80\x8E", # Mandarin Chinese (Traditional Chinese script) (cmn-hant)
                'zh-hk' => "中文(香港)\xE2\x80\x8E", # Chinese (Hong Kong)
-               'zh-min-nan' => 'Bân-lâm-gú', # Min-nan -- (see bug 8217)
+               'zh-min-nan' => 'Bân-lâm-gú', # Min-nan -- (see T10217)
                'zh-mo' => "中文(澳門)\xE2\x80\x8E", # Chinese (Macau)
                'zh-my' => "中文(马来西亚)\xE2\x80\x8E", # Chinese (Malaysia)
                'zh-sg' => "中文(新加坡)\xE2\x80\x8E", # Chinese (Singapore)
                'zh-tw' => "中文(台灣)\xE2\x80\x8E", # Chinese (Taiwan)
-               'zh-yue' => '粵語', # Cantonese -- (see bug 8217)
+               'zh-yue' => '粵語', # Cantonese -- (see T10217)
                'zu' => 'isiZulu' # Zulu
        ];
 }
index 4594385..55813ae 100644 (file)
@@ -542,7 +542,6 @@ public static $zh2Hant = [
 '帼' => '幗',
 '幂' => '冪',
 '并' => '並',
-'幺' => '么',
 '广' => '廣',
 '庄' => '莊',
 '庆' => '慶',
@@ -3009,7 +3008,6 @@ public static $zh2Hant = [
 '0只支援' => '0只支援',
 '0周后' => '0周後',
 '0天后' => '0天後',
-'0年' => '0年',
 '0只' => '0隻',
 '0余' => '0餘',
 '0出' => '0齣',
@@ -3017,63 +3015,54 @@ public static $zh2Hant = [
 '1只支援' => '1只支援',
 '1周后' => '1周後',
 '1天后' => '1天後',
-'1年' => '1年',
 '1只' => '1隻',
 '1余' => '1餘',
 '2只支持' => '2只支持',
 '2只支援' => '2只支援',
 '2周后' => '2周後',
 '2天后' => '2天後',
-'2年' => '2年',
 '2只' => '2隻',
 '2余' => '2餘',
 '3只支持' => '3只支持',
 '3只支援' => '3只支援',
 '3周后' => '3周後',
 '3天后' => '3天後',
-'3年' => '3年',
 '3只' => '3隻',
 '3余' => '3餘',
 '4只支持' => '4只支持',
 '4只支援' => '4只支援',
 '4周后' => '4周後',
 '4天后' => '4天後',
-'4年' => '4年',
 '4只' => '4隻',
 '4余' => '4餘',
 '5只支持' => '5只支持',
 '5只支援' => '5只支援',
 '5周后' => '5周後',
 '5天后' => '5天後',
-'5年' => '5年',
 '5只' => '5隻',
 '5余' => '5餘',
 '6只支持' => '6只支持',
 '6只支援' => '6只支援',
 '6周后' => '6周後',
 '6天后' => '6天後',
-'6年' => '6年',
 '6只' => '6隻',
 '6余' => '6餘',
 '7只支持' => '7只支持',
 '7只支援' => '7只支援',
 '7周后' => '7周後',
 '7天后' => '7天後',
-'7年' => '7年',
 '7只' => '7隻',
 '7余' => '7餘',
 '8只支持' => '8只支持',
 '8只支援' => '8只支援',
 '8周后' => '8周後',
 '8天后' => '8天後',
-'8年' => '8年',
 '8只' => '8隻',
 '8余' => '8餘',
 '9只支持' => '9只支持',
 '9只支援' => '9只支援',
 '9周后' => '9周後',
 '9天后' => '9天後',
-'9年' => '9年',
 '9只' => '9隻',
 '9余' => '9餘',
 '·范' => '·范',
@@ -3081,7 +3070,6 @@ public static $zh2Hant = [
 '、面点' => '、麵點',
 '。个中' => '。箇中',
 '〇周后' => '〇周後',
-'〇年' => '〇年',
 '〇只' => '〇隻',
 '〇余' => '〇餘',
 '“' => '「',
@@ -3108,8 +3096,6 @@ public static $zh2Hant = [
 '一干弟兄' => '一干弟兄',
 '一干弟子' => '一干弟子',
 '一干部下' => '一干部下',
-'一年' => '一年',
-'一年里' => '一年裡',
 '一斗斗' => '一斗斗',
 '一树百获' => '一樹百穫',
 '一准' => '一準',
@@ -3138,7 +3124,6 @@ public static $zh2Hant = [
 '七个' => '七個',
 '七周后' => '七周後',
 '七天后' => '七天後',
-'七年' => '七年',
 '七情六欲' => '七情六慾',
 '七扎' => '七紮',
 '七只' => '七隻',
@@ -3148,7 +3133,6 @@ public static $zh2Hant = [
 '三个' => '三個',
 '三周后' => '三周後',
 '三天后' => '三天後',
-'三年' => '三年',
 '三征七辟' => '三徵七辟',
 '三准' => '三準',
 '三扎' => '三紮',
@@ -3161,6 +3145,7 @@ public static $zh2Hant = [
 '上梁山' => '上梁山',
 '上梁' => '上樑',
 '上台面' => '上檯面',
+'上签了' => '上簽了',
 '上签名' => '上簽名',
 '上签字' => '上簽字',
 '上签定' => '上簽定',
@@ -3175,9 +3160,9 @@ public static $zh2Hant = [
 '上课钟' => '上課鐘',
 '上面糊' => '上面糊',
 '下文里' => '下文裡',
-'下于' => '下於',
 '下梁' => '下樑',
 '下注解' => '下注解',
+'下签了' => '下簽了',
 '下签名' => '下簽名',
 '下签字' => '下簽字',
 '下签定' => '下簽定',
@@ -3230,7 +3215,6 @@ public static $zh2Hant = [
 '丑月' => '丑月',
 '丑表功' => '丑表功',
 '丑角' => '丑角',
-'且于' => '且於',
 '世界杯' => '世界盃',
 '世纪里' => '世紀裡',
 '世纪钟' => '世紀鐘',
@@ -3253,7 +3237,7 @@ public static $zh2Hant = [
 '中岳' => '中嶽',
 '中庄子' => '中庄子',
 '中文里' => '中文裡',
-'中于' => '中於',
+'中签了' => '中簽了',
 '中签名' => '中簽名',
 '中签字' => '中簽字',
 '中签定' => '中簽定',
@@ -3286,20 +3270,34 @@ public static $zh2Hant = [
 '主钟差' => '主鐘差',
 '主钟曲线' => '主鐘曲線',
 '乃系' => '乃係',
-'么么唱唱' => '么么唱唱',
 '么九' => '么九',
-'么儿' => '么兒',
+'么二三' => '么二三',
+'么元' => '么元',
+'么兒' => '么兒',
 '么半' => '么半',
+'么叔' => '么叔',
 '么喝' => '么喝',
 '么女' => '么女',
 '么妹' => '么妹',
+'么姓' => '么姓',
+'么姨' => '么姨',
+'么娘' => '么娘',
+'么媽' => '么媽',
+'么孃' => '么孃',
 '么子' => '么子',
+'么小' => '么小',
 '么弟' => '么弟',
 '么正' => '么正',
-'么爷' => '么爺',
+'么氏' => '么氏',
+'么爸' => '么爸',
+'么爹' => '么爹',
+'么爺' => '么爺',
+'么篇' => '么篇',
+'么舅' => '么舅',
+'么蛾子' => '么蛾子',
 '么雞' => '么雞',
-'么么小丑' => '么麼小丑',
-'么麼小丑' => '么麼小丑',
+'么鳳' => '么鳳',
+'么麼' => '么麼',
 '之一只' => '之一只',
 '之二只' => '之二只',
 '之八九只' => '之八九只',
@@ -3313,7 +3311,6 @@ public static $zh2Hant = [
 '九个' => '九個',
 '九周后' => '九周後',
 '九天后' => '九天後',
-'九年' => '九年',
 '九谷' => '九穀',
 '九扎' => '九紮',
 '九只' => '九隻',
@@ -3486,7 +3483,6 @@ public static $zh2Hant = [
 '二只得' => '二只得',
 '二周后' => '二周後',
 '二天后' => '二天後',
-'二年' => '二年',
 '二缶钟惑' => '二缶鐘惑',
 '二老板' => '二老板',
 '二虎相斗' => '二虎相鬥',
@@ -3712,7 +3708,6 @@ public static $zh2Hant = [
 '五天后' => '五天後',
 '五峰县' => '五峯縣',
 '五岳' => '五嶽',
-'五年' => '五年',
 '五谷' => '五穀',
 '五扎' => '五紮',
 '五脏' => '五臟',
@@ -3723,7 +3718,6 @@ public static $zh2Hant = [
 '五余' => '五餘',
 '井干' => '井幹',
 '井里' => '井裡',
-'亚于' => '亞於',
 '交托' => '交託',
 '交游' => '交遊',
 '交哄' => '交鬨',
@@ -3758,8 +3752,6 @@ public static $zh2Hant = [
 '价川' => '价川',
 '任何钟' => '任何鐘',
 '任何钟表' => '任何鐘錶',
-'任教于' => '任教於',
-'任于' => '任於',
 '仿制' => '仿製',
 '伊于湖底' => '伊于湖底',
 '伊府面' => '伊府麵',
@@ -3781,9 +3773,7 @@ public static $zh2Hant = [
 '休征' => '休徵',
 '伙头' => '伙頭',
 '伴游' => '伴遊',
-'似于' => '似於',
 '但云' => '但云',
-'位于' => '位於',
 '位准' => '位準',
 '低洼' => '低洼',
 '住扎' => '住紮',
@@ -3836,13 +3826,11 @@ public static $zh2Hant = [
 '并购' => '併購',
 '并骨' => '併骨',
 '使其斗' => '使其鬥',
-'来于' => '來於',
 '侍仆' => '侍僕',
 '依依不舍' => '依依不捨',
 '依托' => '依託',
 '侵并' => '侵併',
 '局促' => '侷促',
-'便于' => '便於',
 '系数' => '係數',
 '系为' => '係為',
 '保险柜' => '保險柜',
@@ -3882,7 +3870,6 @@ public static $zh2Hant = [
 '傲霜斗雪' => '傲霜鬥雪',
 '传位于四太子' => '傳位于四太子',
 '傳位于四太子' => '傳位于四太子',
-'传于' => '傳於',
 '债累累' => '債纍纍',
 '傻里傻气' => '傻裡傻氣',
 '仅余' => '僅餘',
@@ -3919,7 +3906,6 @@ public static $zh2Hant = [
 '亿个' => '億個',
 '亿周后' => '億周後',
 '亿天后' => '億天後',
-'亿年' => '億年',
 '亿只' => '億隻',
 '亿余' => '億餘',
 '俭仆' => '儉僕',
@@ -3941,7 +3927,6 @@ public static $zh2Hant = [
 '尽自' => '儘自',
 '尽速' => '儘速',
 '尽量' => '儘量',
-'优于' => '優於',
 '优游' => '優遊',
 '兀术' => '兀朮',
 '元凶' => '元兇',
@@ -3989,7 +3974,6 @@ public static $zh2Hant = [
 '两个' => '兩個',
 '两周后' => '兩周後',
 '两天后' => '兩天後',
-'两年' => '兩年',
 '两杆' => '兩桿',
 '两扎' => '兩紮',
 '两虎共斗' => '兩虎共鬥',
@@ -4001,7 +3985,6 @@ public static $zh2Hant = [
 '八周后' => '八周後',
 '八天后' => '八天後',
 '八字胡' => '八字鬍',
-'八年' => '八年',
 '八扎' => '八紮',
 '八蜡' => '八蜡',
 '八只' => '八隻',
@@ -4020,7 +4003,6 @@ public static $zh2Hant = [
 '六个' => '六個',
 '六周后' => '六周後',
 '六天后' => '六天後',
-'六年' => '六年',
 '六楼后座' => '六樓后座',
 '六樓后座' => '六樓后座',
 '六谷' => '六穀',
@@ -4072,7 +4054,6 @@ public static $zh2Hant = [
 '出乖弄丑' => '出乖弄醜',
 '出乖露丑' => '出乖露醜',
 '出征收' => '出征收',
-'出于' => '出於',
 '出游' => '出遊',
 '出丑' => '出醜',
 '函数里' => '函數裡',
@@ -4081,7 +4062,6 @@ public static $zh2Hant = [
 '分多钟' => '分多鐘',
 '分子钟' => '分子鐘',
 '分子云' => '分子雲',
-'分布于' => '分布於',
 '分钟' => '分鐘',
 '分钟里' => '分鐘裡',
 '刑余' => '刑餘',
@@ -4127,8 +4107,6 @@ public static $zh2Hant = [
 '判断发' => '判斷發',
 '别辟' => '別闢',
 '利欲' => '利慾',
-'利于' => '利於',
-'刮来刮去' => '刮來刮去',
 '刮起来' => '刮起來',
 '刮胡' => '刮鬍',
 '到山里' => '到山裡',
@@ -4177,11 +4155,8 @@ public static $zh2Hant = [
 '力争上游' => '力爭上遊',
 '功勋' => '功勳',
 '加氢精制' => '加氫精制',
-'劣于' => '劣於',
-'助于' => '助於',
 '劫余' => '劫餘',
 '勃郁' => '勃鬱',
-'胜于' => '勝於',
 '勤仆' => '勤僕',
 '勤朴' => '勤樸',
 '勋劳' => '勳勞',
@@ -4203,7 +4178,6 @@ public static $zh2Hant = [
 '北回线' => '北迴線',
 '北回铁路' => '北迴鐵路',
 '匪干' => '匪幹',
-'匿于' => '匿於',
 '区里有' => '區裡有',
 '区里的' => '區裡的',
 '十个' => '十個',
@@ -4214,7 +4188,6 @@ public static $zh2Hant = [
 '十出头' => '十出頭',
 '十周后' => '十周後',
 '十天后' => '十天後',
-'十年' => '十年',
 '十扎' => '十紮',
 '十只' => '十隻',
 '十余' => '十餘',
@@ -4229,7 +4202,6 @@ public static $zh2Hant = [
 '千只足夠' => '千只足夠',
 '千周后' => '千周後',
 '千天后' => '千天後',
-'千年' => '千年',
 '千扎' => '千紮',
 '千回百折' => '千迴百折',
 '千回百转' => '千迴百轉',
@@ -4240,7 +4212,6 @@ public static $zh2Hant = [
 '半制品' => '半制品',
 '半只可' => '半只可',
 '半只够' => '半只夠',
-'半于' => '半於',
 '半只' => '半隻',
 '协防' => '協防',
 '南京钟' => '南京鐘',
@@ -4260,7 +4231,6 @@ public static $zh2Hant = [
 '印累绶若' => '印纍綬若',
 '印制' => '印製',
 '印鉴' => '印鑑',
-'危于' => '危於',
 '卵与石斗' => '卵與石鬥',
 '卷须' => '卷鬚',
 '厂部' => '厂部',
@@ -4279,7 +4249,6 @@ public static $zh2Hant = [
 '反复' => '反覆',
 '反覆' => '反覆',
 '取舍' => '取捨',
-'取决于' => '取決於',
 '受雇' => '受僱',
 '受托' => '受託',
 '丛林里' => '叢林裡',
@@ -4385,7 +4354,6 @@ public static $zh2Hant = [
 '吊钟' => '吊鐘',
 '同人志' => '同人誌',
 '同伙' => '同夥',
-'同于' => '同於',
 '同余' => '同餘',
 '名单于' => '名單於',
 '后冠' => '后冠',
@@ -4483,7 +4451,6 @@ public static $zh2Hant = [
 '喂喲' => '喂喲',
 '喂!' => '喂!',
 '喂,' => '喂,',
-'善于' => '善於',
 '喜欢表' => '喜歡錶',
 '喜欢钟' => '喜歡鐘',
 '喜欢钟表' => '喜歡鐘錶',
@@ -4517,7 +4484,6 @@ public static $zh2Hant = [
 '向迩' => '嚮邇',
 '严云农' => '嚴云農',
 '嚴云農' => '嚴云農',
-'严于' => '嚴於',
 '嚼谷' => '嚼穀',
 '啰啰苏苏' => '囉囉囌囌',
 '啰苏' => '囉囌',
@@ -4529,7 +4495,6 @@ public static $zh2Hant = [
 '四分历史' => '四分歷史',
 '四周后' => '四周後',
 '四天后' => '四天後',
-'四年' => '四年',
 '四舍五入' => '四捨五入',
 '四舍六入' => '四捨六入',
 '四杆铁笔' => '四桿鐵筆',
@@ -4551,19 +4516,15 @@ public static $zh2Hant = [
 '回复邮件' => '回覆郵件',
 '回复:' => '回覆:',
 '回游' => '回遊',
-'因于' => '因於',
 '困倦起来' => '困倦起來',
-'困于' => '困於',
 '困兽之斗' => '困獸之鬥',
 '困兽犹斗' => '困獸猶鬥',
 '困斗' => '困鬥',
 '固定制' => '固定制',
 '固征' => '固徵',
-'囿于' => '囿於',
 '圈梁' => '圈樑',
 '圈里' => '圈裡',
 '国之桢干' => '國之楨榦',
-'国于' => '國於',
 '国历' => '國曆',
 '国历代' => '國歷代',
 '国历任' => '國歷任',
@@ -4582,22 +4543,21 @@ public static $zh2Hant = [
 '土制' => '土製',
 '在制品' => '在制品',
 '在山里' => '在山裡',
-'在于' => '在於',
 '地图里' => '地圖裡',
 '地心历表' => '地心曆表',
 '地志' => '地誌',
 '地丑德齐' => '地醜德齊',
-'å\9d\8fäº\8e' => 'å\9d\8fæ\96¼',
-'å\9d\8fæ\96¼' => 'å\9d\8fæ\96¼',
+'å\9d\90å\8f°é\90µ' => 'å\9d\90å\8f°é\90µ',
+'å\9d\90å\8f°é\93\81' => 'å\9d\90å\8f°é\90µ',
 '坐如钟' => '坐如鐘',
 '坐台' => '坐檯',
 '坐钟' => '坐鐘',
+'坑口里' => '坑口里',
 '坑里' => '坑裡',
 '坤范' => '坤範',
 '坦荡' => '坦蕩',
 '坦荡荡' => '坦蕩蕩',
 '坱郁' => '坱鬱',
-'垂于' => '垂於',
 '垂范' => '垂範',
 '垂发' => '垂髮',
 '型范' => '型範',
@@ -4611,7 +4571,6 @@ public static $zh2Hant = [
 '埔里社' => '埔裏社',
 '域里' => '域裡',
 '基干' => '基幹',
-'基于' => '基於',
 '基准' => '基準',
 '坚致' => '堅緻',
 '堙淀' => '堙澱',
@@ -4663,7 +4622,6 @@ public static $zh2Hant = [
 '多只须' => '多只須',
 '多周后' => '多周後',
 '多天后' => '多天後',
-'多于' => '多於',
 '多冲' => '多衝',
 '多丑' => '多醜',
 '多只' => '多隻',
@@ -4766,7 +4724,6 @@ public static $zh2Hant = [
 '好斗胆' => '好斗膽',
 '好斗膽' => '好斗膽',
 '好斗蓬' => '好斗蓬',
-'好于' => '好於',
 '好困' => '好睏',
 '好签' => '好籤',
 '好丑' => '好醜',
@@ -4776,7 +4733,7 @@ public static $zh2Hant = [
 '妖后' => '妖后',
 '妖气冲天' => '妖氣衝天',
 '妆台' => '妝檯',
-'å§\8bäº\8e' => 'å§\8bæ\96¼',
+'å§\93ä¹\88' => 'å§\93ä¹\88',
 '委托' => '委託',
 '委托书' => '委託書',
 '奸夫' => '姦夫',
@@ -4787,7 +4744,6 @@ public static $zh2Hant = [
 '奸淫' => '姦淫',
 '威棱' => '威稜',
 '婢仆' => '婢僕',
-'嫁祸于' => '嫁禍於',
 '嫌凶' => '嫌兇',
 '嫌好道丑' => '嫌好道醜',
 '嫩姜' => '嫩薑',
@@ -4803,7 +4759,6 @@ public static $zh2Hant = [
 '字码表' => '字碼表',
 '字里行间' => '字裡行間',
 '存折' => '存摺',
-'存于' => '存於',
 '孛里海' => '孛里海',
 '孝惠后' => '孝惠后',
 '孙杰' => '孫杰',
@@ -4811,7 +4766,6 @@ public static $zh2Hant = [
 '学家' => '學家',
 '学里' => '學裡',
 '宇宙志' => '宇宙誌',
-'安于' => '安於',
 '安沈铁路' => '安瀋鐵路',
 '宋王台' => '宋王臺',
 '宗周钟' => '宗周鐘',
@@ -4819,19 +4773,16 @@ public static $zh2Hant = [
 '官地为采' => '官地為寀',
 '官历' => '官曆',
 '官历史' => '官歷史',
-'定于' => '定於',
 '定准' => '定準',
 '定制' => '定製',
 '宜云' => '宜云',
 '宣泄' => '宣洩',
 '宦游' => '宦遊',
 '宫里' => '宮裡',
-'害于' => '害於',
 '宴游' => '宴遊',
 '家仆' => '家僕',
 '家里' => '家裡',
 '家丑' => '家醜',
-'容于' => '容於',
 '容范' => '容範',
 '宿舍' => '宿舍',
 '寄托在' => '寄托在',
@@ -4841,14 +4792,12 @@ public static $zh2Hant = [
 '寇仇' => '寇讎',
 '富余' => '富餘',
 '寒栗' => '寒慄',
-'寒于' => '寒於',
-'寓于' => '寓於',
+'寓禁于征' => '寓禁於徵',
 '寡欲' => '寡慾',
 '实干' => '實幹',
 '实累累' => '實纍纍',
 '实验里' => '實驗裡',
 '写字台' => '寫字檯',
-'宽于' => '寬於',
 '宽余' => '寬餘',
 '宽松' => '寬鬆',
 '宽松松' => '寬鬆鬆',
@@ -4870,7 +4819,6 @@ public static $zh2Hant = [
 '尊后' => '尊后',
 '对不准' => '對不準',
 '对折' => '對摺',
-'对于' => '對於',
 '对准' => '對準',
 '对准表' => '對準錶',
 '对准钟' => '對準鐘',
@@ -4930,9 +4878,7 @@ public static $zh2Hant = [
 '屋梁' => '屋樑',
 '屋里' => '屋裡',
 '屏风后' => '屏風後',
-'屑于' => '屑於',
 '屡顾尔仆' => '屢顧爾僕',
-'属于' => '屬於',
 '属托' => '屬託',
 '屯扎' => '屯紮',
 '屯里' => '屯裡',
@@ -4982,11 +4928,11 @@ public static $zh2Hant = [
 '巧历史' => '巧歷史',
 '巨制' => '巨製',
 '差之毫厘' => '差之毫厘',
-'差于' => '差於',
 '己丑' => '己丑',
 '已占卜' => '已占卜',
 '已占算' => '已占算',
 '巴尔干' => '巴爾幹',
+'巴而术' => '巴而朮',
 '巷里' => '巷裡',
 '市里的' => '市裡的',
 '布谷' => '布穀',
@@ -5018,8 +4964,6 @@ public static $zh2Hant = [
 '并州' => '并州',
 '并日而食' => '并日而食',
 '并迭' => '并迭',
-'幸免于难' => '幸免於難',
-'幸于' => '幸於',
 '幸运胡' => '幸運鬍',
 '干上' => '幹上',
 '干下去' => '幹下去',
@@ -5106,7 +5050,6 @@ public static $zh2Hant = [
 '广舍' => '廣捨',
 '广播里' => '廣播裡',
 '延历' => '延曆',
-'建于' => '建於',
 '建筑前' => '建築前',
 '建筑后' => '建築後',
 '弄干' => '弄乾',
@@ -5151,7 +5094,6 @@ public static $zh2Hant = [
 '引斗' => '引鬥',
 '弘历' => '弘曆',
 '弘历史' => '弘歷史',
-'弱于' => '弱於',
 '弱水三千只取一瓢' => '弱水三千只取一瓢',
 '张三丰' => '張三丰',
 '張三丰' => '張三丰',
@@ -5166,7 +5108,6 @@ public static $zh2Hant = [
 '强制作用' => '強制作用',
 '强奸' => '強姦',
 '强干' => '強幹',
-'强于' => '強於',
 '别扭' => '彆扭',
 '别拗' => '彆拗',
 '别气' => '彆氣',
@@ -5177,11 +5118,9 @@ public static $zh2Hant = [
 '汇纂' => '彙纂',
 '汇辑' => '彙輯',
 '形单影只' => '形單影隻',
-'形于' => '形於',
 '彭于晏' => '彭于晏',
 '影后' => '影后',
 '影相吊' => '影相弔',
-'役于' => '役於',
 '往复式' => '往復式',
 '往日无仇' => '往日無讎',
 '往里' => '往裡',
@@ -5205,7 +5144,6 @@ public static $zh2Hant = [
 '从仆' => '從僕',
 '从图里' => '從圖裡',
 '从山里' => '從山裡',
-'从于' => '從於',
 '从里到外' => '從裡到外',
 '从里向外' => '從裡向外',
 '御岳山' => '御嶽山',
@@ -5262,7 +5200,6 @@ public static $zh2Hant = [
 '征风召雨' => '徵風召雨',
 '征验' => '徵驗',
 '心愿' => '心愿',
-'心于' => '心於',
 '心理' => '心理',
 '心细如发' => '心細如髮',
 '心系一' => '心繫一',
@@ -5389,18 +5326,14 @@ public static $zh2Hant = [
 '忙里偷闲' => '忙裡偷閒',
 '忠人之托' => '忠人之托',
 '忠仆' => '忠僕',
-'忠于' => '忠於',
 '快快当当' => '快快當當',
 '快冲' => '快衝',
 '怎么干' => '怎麼幹',
-'怒于' => '怒於',
 '怒气冲天' => '怒氣衝天',
 '怒火冲天' => '怒火衝天',
 '怒发冲冠' => '怒髮衝冠',
 '怜奈' => '怜奈',
 '思如泉涌' => '思如泉湧',
-'怠于' => '怠於',
-'急于' => '急於',
 '急冲而下' => '急衝而下',
 '性别扭曲' => '性別扭曲',
 '性征' => '性徵',
@@ -5446,7 +5379,6 @@ public static $zh2Hant = [
 '愛河里花子' => '愛河里花子',
 '爱河里花子' => '愛河里花子',
 '爱困' => '愛睏',
-'感于' => '感於',
 '愿朴' => '愿樸',
 '愿樸' => '愿樸',
 '愿而恭' => '愿而恭',
@@ -5491,13 +5423,11 @@ public static $zh2Hant = [
 '悬钟' => '懸鐘',
 '懿范' => '懿範',
 '恋恋不舍' => '戀戀不捨',
-'成于' => '成於',
 '成于思' => '成於思',
 '戬谷' => '戩穀',
 '截发' => '截髮',
 '战天斗地' => '戰天鬥地',
 '战栗' => '戰慄',
-'战于' => '戰於',
 '战斗' => '戰鬥',
 '戏里' => '戲裡',
 '戲院里' => '戲院里',
@@ -5604,14 +5534,10 @@ public static $zh2Hant = [
 '拉面部' => '拉面部',
 '拉面' => '拉麵',
 '拌面' => '拌麵',
-'拒人于' => '拒人於',
-'拒于' => '拒於',
 '拓朴' => '拓樸',
 '拔发' => '拔髮',
 '拔须' => '拔鬚',
 '拗别' => '拗彆',
-'拘于' => '拘於',
-'拙于' => '拙於',
 '拙朴' => '拙樸',
 '拼却' => '拚卻',
 '拼命' => '拚命',
@@ -5794,10 +5720,8 @@ public static $zh2Hant = [
 '提心吊胆' => '提心弔膽',
 '提摩太后书' => '提摩太後書',
 '提高后' => '提高後',
-'插于' => '插於',
 '换签' => '換籤',
 '换只' => '換隻',
-'换发' => '換髮',
 '握发' => '握髮',
 '揩干' => '揩乾',
 '揪采' => '揪採',
@@ -5807,7 +5731,6 @@ public static $zh2Hant = [
 '挥手表' => '揮手表',
 '揮手表' => '揮手表',
 '搋面' => '搋麵',
-'损于' => '損於',
 '搏斗' => '搏鬥',
 '捣鬼吊白' => '搗鬼弔白',
 '扼肮' => '搤肮',
@@ -5841,7 +5764,6 @@ public static $zh2Hant = [
 '撤并' => '撤併',
 '拨谷' => '撥穀',
 '撩斗' => '撩鬥',
-'播于' => '播於',
 '扑冬' => '撲鼕',
 '扑咚' => '撲鼕',
 '扑咚咚' => '撲鼕鼕',
@@ -5869,16 +5791,12 @@ public static $zh2Hant = [
 '放松' => '放鬆',
 '政斗' => '政鬥',
 '故云' => '故云',
-'敏于' => '敏於',
-'败于' => '敗於',
 '教学钟' => '教學鐘',
-'教于' => '教於',
 '教范' => '教範',
 '敢干' => '敢幹',
 '敢情欲' => '敢情欲',
 '敢斗了胆' => '敢斗了膽',
 '散伙' => '散夥',
-'散于' => '散於',
 '散荡' => '散蕩',
 '敦朴' => '敦樸',
 '敬挽' => '敬輓',
@@ -5929,15 +5847,12 @@ public static $zh2Hant = [
 '方便面' => '方便麵',
 '方向' => '方向',
 '方法里' => '方法裡',
-'于后' => '於後',
-'于征' => '於徵',
 '于海上' => '於海上',
 '于海边' => '於海邊',
 '于震中' => '於震中',
 '于震前' => '於震前',
 '于震后' => '於震後',
 '施舍' => '施捨',
-'施于' => '施於',
 '施舍之道' => '施舍之道',
 '旁征博引' => '旁徵博引',
 '旁注' => '旁註',
@@ -5950,7 +5865,6 @@ public static $zh2Hant = [
 '日历史' => '日歷史',
 '日里' => '日裡',
 '日志' => '日誌',
-'早于' => '早於',
 '旱干' => '旱乾',
 '升州' => '昇州',
 '升平' => '昇平',
@@ -5961,7 +5875,6 @@ public static $zh2Hant = [
 '明窗净几' => '明窗淨几',
 '明范' => '明範',
 '明鉴' => '明鑑',
-'易于' => '易於',
 '昔人有云' => '昔人有云',
 '星历' => '星曆',
 '星期后' => '星期後',
@@ -5973,7 +5886,6 @@ public static $zh2Hant = [
 '时钟' => '時鐘',
 '时间不准' => '時間不準',
 '晃荡' => '晃蕩',
-'晚于' => '晚於',
 '晚钟' => '晚鐘',
 '晞发' => '晞髮',
 '晨钟' => '晨鐘',
@@ -6048,7 +5960,6 @@ public static $zh2Hant = [
 '有只' => '有隻',
 '有余' => '有餘',
 '有发头陀寺' => '有髮頭陀寺',
-'服于' => '服於',
 '望了望' => '望了望',
 '望后石' => '望后石',
 '朝乾夕惕' => '朝乾夕惕',
@@ -6069,6 +5980,7 @@ public static $zh2Hant = [
 '本庄' => '本庄',
 '本征' => '本徵',
 '本出戏' => '本齣戲',
+'术虎高' => '朮虎高',
 '术赤' => '朮赤',
 '朱庆余' => '朱慶餘',
 '朱理安历' => '朱理安曆',
@@ -6117,7 +6029,6 @@ public static $zh2Hant = [
 '枯干' => '枯乾',
 '架钟' => '架鐘',
 '某只' => '某隻',
-'染指于' => '染指於',
 '染殿后' => '染殿后',
 '染发' => '染髮',
 '柜上' => '柜上',
@@ -6132,7 +6043,6 @@ public static $zh2Hant = [
 '校准' => '校準',
 '校舍' => '校舍',
 '核准' => '核准',
-'格于' => '格於',
 '格范' => '格範',
 '格里历' => '格里曆',
 '格里高利历' => '格里高利曆',
@@ -6175,7 +6085,6 @@ public static $zh2Hant = [
 '杠杆' => '槓桿',
 '乐器钟' => '樂器鐘',
 '乐游原' => '樂遊原',
-'樊于期' => '樊於期',
 '梁上' => '樑上',
 '梁柱' => '樑柱',
 '樗里子' => '樗里子',
@@ -6240,7 +6149,6 @@ public static $zh2Hant = [
 '歌后' => '歌后',
 '歌钟' => '歌鐘',
 '欧游' => '歐遊',
-'止于' => '止於',
 '正官庄' => '正官庄',
 '正文里' => '正文裡',
 '正杰' => '正杰',
@@ -6251,10 +6159,8 @@ public static $zh2Hant = [
 '歲聿云暮' => '歲聿云暮',
 '历史里' => '歷史裡',
 '归并' => '歸併',
-'归于' => '歸於',
 '归余' => '歸餘',
 '歹斗' => '歹鬥',
-'死于' => '死於',
 '死里求生' => '死裡求生',
 '死里逃生' => '死裡逃生',
 '殖谷' => '殖穀',
@@ -6264,8 +6170,8 @@ public static $zh2Hant = [
 '殷师牛斗' => '殷師牛鬥',
 '殷鉴' => '殷鑑',
 '壳里' => '殼裡',
+'殿里' => '殿裡',
 '殿钟自鸣' => '殿鐘自鳴',
-'毁于' => '毀於',
 '毁钟为铎' => '毀鐘為鐸',
 '殴斗' => '毆鬥',
 '母后' => '母后',
@@ -6305,7 +6211,6 @@ public static $zh2Hant = [
 '污蔑' => '污衊',
 '汤卤' => '汤滷',
 '汤滷' => '汤滷',
-'汲于' => '汲於',
 '决斗' => '決鬥',
 '沈淀' => '沈澱',
 '沈郁' => '沈鬱',
@@ -6336,7 +6241,6 @@ public static $zh2Hant = [
 '泡面' => '泡麵',
 '波棱菜' => '波稜菜',
 '波发藻' => '波髮藻',
-'泥于' => '泥於',
 '注云' => '注云',
 '注释' => '注釋',
 '泰山梁木' => '泰山梁木',
@@ -6361,7 +6265,6 @@ public static $zh2Hant = [
 '洪钟' => '洪鐘',
 '汹涌' => '洶湧',
 '流征' => '流徵',
-'流于' => '流於',
 '流荡' => '流蕩',
 '流风余俗' => '流風餘俗',
 '流风余韵' => '流風餘韻',
@@ -6369,7 +6272,6 @@ public static $zh2Hant = [
 '浩荡' => '浩蕩',
 '浪荡' => '浪蕩',
 '浪游' => '浪遊',
-'浮于' => '浮於',
 '浮荡' => '浮蕩',
 '浮夸' => '浮誇',
 '浮松' => '浮鬆',
@@ -6410,7 +6312,6 @@ public static $zh2Hant = [
 '淑范' => '淑範',
 '泪干' => '淚乾',
 '泪如泉涌' => '淚如泉湧',
-'淡于' => '淡於',
 '淡蒙蒙' => '淡濛濛',
 '净余' => '淨餘',
 '净发' => '淨髮',
@@ -6447,7 +6348,6 @@ public static $zh2Hant = [
 '汤下面' => '湯下麵',
 '汤团' => '湯糰',
 '汤面' => '湯麵',
-'源于' => '源於',
 '准不准' => '準不準',
 '准例' => '準例',
 '准保' => '準保',
@@ -6484,10 +6384,8 @@ public static $zh2Hant = [
 '沟大曲' => '溝大麯',
 '沟谷' => '溝谷',
 '溟蒙' => '溟濛',
-'溢于' => '溢於',
 '温洛克期' => '溫洛克期',
 '溲面' => '溲麵',
-'溺于' => '溺於',
 '滃郁' => '滃鬱',
 '滑借' => '滑藉',
 '汇丰' => '滙豐',
@@ -6530,7 +6428,6 @@ public static $zh2Hant = [
 '潜水钟表' => '潛水鐘錶',
 '潭里' => '潭裡',
 '潮涌' => '潮湧',
-'溃于' => '潰於',
 '涩谷区' => '澀谷區',
 '澄江县' => '澂江縣',
 '澄澹精致' => '澄澹精致',
@@ -6671,10 +6568,8 @@ public static $zh2Hant = [
 '犖确' => '犖确',
 '荦确' => '犖确',
 '狂并潮' => '狂併潮',
-'狃于' => '狃於',
 '狄志杰' => '狄志杰',
 '狐借虎威' => '狐藉虎威',
-'猛于' => '猛於',
 '猛冲' => '猛衝',
 '猜三划五' => '猜三划五',
 '犹如表' => '猶如錶',
@@ -6699,7 +6594,6 @@ public static $zh2Hant = [
 '王余鱼' => '王餘魚',
 '珍肴异馔' => '珍肴異饌',
 '班里' => '班裡',
-'现于' => '現於',
 '球台' => '球檯',
 '理一个发' => '理一個髮',
 '理一次发' => '理一次髮',
@@ -6716,13 +6610,11 @@ public static $zh2Hant = [
 '瓷制' => '瓷製',
 '甄后' => '甄后',
 '瓮安' => '甕安',
-'甚于' => '甚於',
 '甜、咸' => '甜、鹹',
 '甜水面' => '甜水麵',
 '甜咸' => '甜鹹',
 '甜面酱' => '甜麵醬',
 '生力面' => '生力麵',
-'生于' => '生於',
 '生物钟' => '生物鐘',
 '生发生' => '生發生',
 '生华发' => '生華髮',
@@ -6730,26 +6622,22 @@ public static $zh2Hant = [
 '生锈' => '生鏽',
 '生发' => '生髮',
 '苏醒' => '甦醒',
-'用于' => '用於',
 '用法里' => '用法裡',
 '甩发' => '甩髮',
 '田子里' => '田子里',
 '田庄英雄' => '田庄英雄',
 '田里' => '田裡',
+'田里穗' => '田里穗',
 '由余' => '由余',
-'由于' => '由於',
 '甲胄' => '甲冑',
 '甲后路' => '甲后路',
 '男仆' => '男僕',
 '界里' => '界裡',
-'畏于' => '畏於',
 '留发展' => '留發展',
 '留发生' => '留發生',
 '留发行' => '留發行',
 '留长发' => '留長髮',
 '留发' => '留髮',
-'毕于' => '畢於',
-'毕业于' => '畢業於',
 '毕生发展' => '畢生發展',
 '画里' => '畫裡',
 '当准' => '當準',
@@ -6759,7 +6647,6 @@ public static $zh2Hant = [
 '疏松' => '疏鬆',
 '疑系' => '疑係',
 '疑凶' => '疑兇',
-'疲于' => '疲於',
 '疲困' => '疲睏',
 '病征' => '病徵',
 '病愈' => '病癒',
@@ -6801,7 +6688,6 @@ public static $zh2Hant = [
 '百周后' => '百周後',
 '百天后' => '百天後',
 '百子里' => '百子里',
-'百年' => '百年',
 '百拙千丑' => '百拙千醜',
 '百科里' => '百科裡',
 '百谷' => '百穀',
@@ -6837,7 +6723,6 @@ public static $zh2Hant = [
 '皱折' => '皺摺',
 '盆吊' => '盆弔',
 '盈余' => '盈餘',
-'益于' => '益於',
 '盒里' => '盒裡',
 '盛赞' => '盛讚',
 '盗采' => '盜採',
@@ -6848,14 +6733,12 @@ public static $zh2Hant = [
 '卢棱伽' => '盧稜伽',
 '荡气回肠' => '盪氣迴腸',
 '盲干' => '盲幹',
-'直于' => '直於',
 '直冲' => '直衝',
 '相并' => '相併',
 '相克制' => '相克制',
 '相克服' => '相克服',
 '相克' => '相剋',
 '相干' => '相干',
-'相于' => '相於',
 '相冲' => '相衝',
 '相斗' => '相鬥',
 '看法里' => '看法裡',
@@ -6871,8 +6754,6 @@ public static $zh2Hant = [
 '眼眶里' => '眼眶裡',
 '眼睛里' => '眼睛裡',
 '眼里' => '眼裡',
-'着眼于' => '着眼於',
-'着眼於' => '着眼於',
 '困乏' => '睏乏',
 '困倦' => '睏倦',
 '困觉' => '睏覺',
@@ -6895,7 +6776,6 @@ public static $zh2Hant = [
 '瞩托' => '矚託',
 '矜夸' => '矜誇',
 '短几' => '短几',
-'短于' => '短於',
 '短发生' => '短發生',
 '短发' => '短髮',
 '矮几' => '矮几',
@@ -6937,7 +6817,6 @@ public static $zh2Hant = [
 '祭吊' => '祭弔',
 '禁欲' => '禁慾',
 '禁欲主义' => '禁欲主義',
-'祸于' => '禍於',
 '御侮' => '禦侮',
 '御寇' => '禦寇',
 '御寒' => '禦寒',
@@ -6973,7 +6852,6 @@ public static $zh2Hant = [
 '秒钟' => '秒鐘',
 '秤杆' => '秤桿',
 '秦沈客运' => '秦瀋客運',
-'移祸于' => '移禍於',
 '稀松' => '稀鬆',
 '程十发' => '程十髮',
 '棱台' => '稜台',
@@ -7004,6 +6882,7 @@ public static $zh2Hant = [
 '谷旦' => '穀旦',
 '谷梁' => '穀梁',
 '谷壳' => '穀殼',
+'谷氨' => '穀氨',
 '谷物' => '穀物',
 '谷皮' => '穀皮',
 '谷神' => '穀神',
@@ -7011,6 +6890,7 @@ public static $zh2Hant = [
 '谷谷' => '穀穀',
 '谷米' => '穀米',
 '谷粒' => '穀粒',
+'谷胱' => '穀胱',
 '谷舱' => '穀艙',
 '谷苗' => '穀苗',
 '谷草' => '穀草',
@@ -7039,11 +6919,9 @@ public static $zh2Hant = [
 '窗帘' => '窗簾',
 '窝里' => '窩裡',
 '窝里斗' => '窩裡鬥',
-'穷于' => '窮於',
 '穷追不舍' => '窮追不捨',
 '穷发' => '窮髮',
 '窃钟掩耳' => '竊鐘掩耳',
-'立于' => '立於',
 '立范' => '立範',
 '童仆' => '童僕',
 '竞斗' => '競鬥',
@@ -7056,7 +6934,6 @@ public static $zh2Hant = [
 '笑里藏刀' => '笑裡藏刀',
 '笔杆' => '筆桿',
 '笔秃墨干' => '筆禿墨乾',
-'等于' => '等於',
 '笋干' => '筍乾',
 '筑前' => '筑前',
 '筑北' => '筑北',
@@ -7126,7 +7003,6 @@ public static $zh2Hant = [
 '精制住' => '精制住',
 '精制服' => '精制服',
 '精干' => '精幹',
-'精于' => '精於',
 '精准' => '精準',
 '精致' => '精緻',
 '精制' => '精製',
@@ -7179,17 +7055,14 @@ public static $zh2Hant = [
 '细如发' => '細如髮',
 '细致' => '細緻',
 '细炼' => '細鍊',
-'终于' => '終於',
 '组里' => '組裡',
 '结伴同游' => '結伴同遊',
 '结伙' => '結夥',
 '结扎' => '結紮',
 '结余' => '結餘',
 '结发' => '結髮',
-'绝于' => '絕於',
 '绞干' => '絞乾',
 '络腮胡' => '絡腮鬍',
-'给于' => '給於',
 '丝恩发怨' => '絲恩髮怨',
 '丝制' => '絲製',
 '丝发' => '絲髮',
@@ -7283,15 +7156,12 @@ public static $zh2Hant = [
 '坛子' => '罈子',
 '坛坛罐罐' => '罈罈罐罐',
 '坛騞' => '罈騞',
-'置于' => '置於',
 '置言成范' => '置言成範',
-'罢于' => '罷於',
 '罗马历' => '羅馬曆',
 '罗马历代' => '羅馬歷代',
 '罗马历史' => '羅馬歷史',
 '羁系' => '羈繫',
 '美容美发' => '美容美髮',
-'美于' => '美於',
 '美丑' => '美醜',
 '美发学' => '美髮學',
 '美发师' => '美髮師',
@@ -7313,7 +7183,6 @@ public static $zh2Hant = [
 '老仆' => '老僕',
 '老干部' => '老幹部',
 '老懞' => '老懞',
-'老于' => '老於',
 '老爷钟' => '老爺鐘',
 '老白干' => '老白乾',
 '老姜' => '老薑',
@@ -7324,7 +7193,7 @@ public static $zh2Hant = [
 '耍斗' => '耍鬥',
 '耕获' => '耕穫',
 '耳余' => '耳餘',
-'è\80¿äº\8e' => 'è\80¿æ\96¼',
+'è\80¶å¾\8bæ\9c¯ç\83\88' => 'è\80¶å¾\8bæ\9c®ç\83\88',
 '聊斋志异' => '聊齋志異',
 '圣人历' => '聖人曆',
 '圣后' => '聖后',
@@ -7336,7 +7205,6 @@ public static $zh2Hant = [
 '闻风后' => '聞風後',
 '联系' => '聯繫',
 '声母后' => '聲母後',
-'听于' => '聽於',
 '肉干' => '肉乾',
 '肉欲' => '肉慾',
 '肉丝面' => '肉絲麵',
@@ -7422,7 +7290,6 @@ public static $zh2Hant = [
 '自制服' => '自制服',
 '自制的能' => '自制的能',
 '自制能力' => '自制能力',
-'自于' => '自於',
 '自然数里' => '自然數裡',
 '自由钟' => '自由鐘',
 '自制' => '自製',
@@ -7431,11 +7298,8 @@ public static $zh2Hant = [
 '臭气冲天' => '臭氣衝天',
 '至多' => '至多',
 '至多只' => '至多只',
-'至于' => '至於',
-'致于' => '致於',
 '台佟' => '臺佟',
 '台静农' => '臺靜農',
-'臻于' => '臻於',
 '舂谷' => '舂穀',
 '举手表' => '舉手表',
 '舉手表' => '舉手表',
@@ -7474,7 +7338,6 @@ public static $zh2Hant = [
 '苑里' => '苑裡',
 '若干' => '若干',
 '苦干' => '苦幹',
-'苦于' => '苦於',
 '苦里' => '苦裡',
 '苦斗' => '苦鬥',
 '苧麻' => '苧麻',
@@ -7508,6 +7371,7 @@ public static $zh2Hant = [
 '庄里' => '莊裡',
 '茎干' => '莖幹',
 '莜面' => '莜麵',
+'莪术' => '莪朮',
 '莽荡' => '莽蕩',
 '菜干' => '菜乾',
 '菜坛' => '菜罈',
@@ -7520,8 +7384,6 @@ public static $zh2Hant = [
 '万个' => '萬個',
 '万周后' => '萬周後',
 '万天后' => '萬天後',
-'万年' => '萬年',
-'万年历' => '萬年曆',
 '万年历表' => '萬年曆錶',
 '万历' => '萬曆',
 '万历史' => '萬歷史',
@@ -7530,7 +7392,6 @@ public static $zh2Hant = [
 '万象' => '萬象',
 '万只' => '萬隻',
 '万余' => '萬餘',
-'落于' => '落於',
 '落腮胡' => '落腮鬍',
 '落发' => '落髮',
 '叶叶琴' => '葉叶琴',
@@ -7542,7 +7403,6 @@ public static $zh2Hant = [
 '葡萄干' => '葡萄乾',
 '董氏封发' => '董氏封髮',
 '葫芦里卖甚么药' => '葫蘆裡賣甚麼藥',
-'葬于' => '葬於',
 '蒙雾露' => '蒙霧露',
 '蒜发' => '蒜髮',
 '蒲席' => '蒲蓆',
@@ -7619,7 +7479,6 @@ public static $zh2Hant = [
 '借箸代筹' => '藉箸代籌',
 '借资' => '藉資',
 '蓝淀' => '藍澱',
-'藏于' => '藏於',
 '藏历' => '藏曆',
 '藏历史' => '藏歷史',
 '藏蒙歌儿' => '藏矇歌兒',
@@ -7637,7 +7496,6 @@ public static $zh2Hant = [
 '萝卜干' => '蘿蔔乾',
 '虎须' => '虎鬚',
 '虎斗' => '虎鬥',
-'处于' => '處於',
 '虚夸' => '虛誇',
 '号志' => '號誌',
 '虫部' => '虫部',
@@ -7666,7 +7524,6 @@ public static $zh2Hant = [
 '行事历史' => '行事歷史',
 '行凶' => '行兇',
 '行家里手' => '行家裡手',
-'行于' => '行於',
 '卫后庄公' => '衛後莊公',
 '卫星钟' => '衛星鐘',
 '冲上' => '衝上',
@@ -7720,7 +7577,6 @@ public static $zh2Hant = [
 '冲风' => '衝風',
 '衡鉴' => '衡鑑',
 '表面包' => '表面包',
-'衷于' => '衷於',
 '袋杆' => '袋桿',
 '袋里' => '袋裡',
 '袋表' => '袋錶',
@@ -7742,7 +7598,6 @@ public static $zh2Hant = [
 '里海' => '裏海',
 '里白' => '裏白',
 '里运河' => '裏運河',
-'补于' => '補於',
 '补注' => '補註',
 '装折' => '裝摺',
 '里勾外连' => '裡勾外連',
@@ -7859,12 +7714,10 @@ public static $zh2Hant = [
 '要冲' => '要衝',
 '复信' => '覆信',
 '复核' => '覆核',
-'见于' => '見於',
 '见棱见角' => '見稜見角',
 '见素抱朴' => '見素抱樸',
 '见钟不打' => '見鐘不打',
 '规范' => '規範',
-'视于' => '視於',
 '观采' => '觀採',
 '角抵' => '角牴',
 '角落发' => '角落發',
@@ -7934,7 +7787,6 @@ public static $zh2Hant = [
 '词干' => '詞幹',
 '词汇' => '詞彙',
 '词余' => '詞餘',
-'询于' => '詢於',
 '试制' => '試製',
 '詩云' => '詩云',
 '诗云' => '詩云',
@@ -8114,7 +7966,6 @@ public static $zh2Hant = [
 '趙惠后' => '趙惠后',
 '赵治勋' => '趙治勳',
 '趱干' => '趲幹',
-'足于' => '足於',
 '足球台' => '足球台',
 '跌扑' => '跌扑',
 '路图里' => '路圖裡',
@@ -8127,10 +7978,8 @@ public static $zh2Hant = [
 '踡局' => '踡跼',
 '逾闲' => '踰閑',
 '蹒局' => '蹣跼',
-'蹪于' => '蹪於',
 '蹭棱子' => '蹭稜子',
 '躁郁' => '躁鬱',
-'身于' => '身於',
 '身体发肤' => '身體髮膚',
 '躯干' => '軀幹',
 '车库里' => '車庫裡',
@@ -8139,7 +7988,6 @@ public static $zh2Hant = [
 '车里雅宾斯克' => '車里雅賓斯克',
 '轨范' => '軌範',
 '轩辟' => '軒闢',
-'较于' => '較於',
 '挽曲' => '輓曲',
 '挽歌' => '輓歌',
 '挽联' => '輓聯',
@@ -8148,7 +7996,6 @@ public static $zh2Hant = [
 '挽车' => '輓車',
 '挽输' => '輓輸',
 '挽辞' => '輓辭',
-'轻于' => '輕於',
 '轻松' => '輕鬆',
 '轻松松' => '輕鬆鬆',
 '轮奸' => '輪姦',
@@ -8173,7 +8020,6 @@ public static $zh2Hant = [
 '近日无仇' => '近日無讎',
 '返朴' => '返樸',
 '迥然回异' => '迥然迴異',
-'迫于' => '迫於',
 '回光返照' => '迴光返照',
 '回圈' => '迴圈',
 '回廊' => '迴廊',
@@ -8201,7 +8047,6 @@ public static $zh2Hant = [
 '回銮' => '迴鑾',
 '回响' => '迴響',
 '回风' => '迴風',
-'迷于' => '迷於',
 '迷蒙' => '迷濛',
 '追凶' => '追兇',
 '退伙' => '退夥',
@@ -8245,7 +8090,6 @@ public static $zh2Hant = [
 '这出' => '這齣',
 '通奸' => '通姦',
 '通心面' => '通心麵',
-'通于' => '通於',
 '通历' => '通曆',
 '通历史' => '通歷史',
 '通鉴' => '通鑑',
@@ -8314,17 +8158,13 @@ public static $zh2Hant = [
 '游错' => '遊錯',
 '游骑兵' => '遊騎兵',
 '游魂' => '遊魂',
-'过于' => '過於',
 '过水面' => '過水麵',
 '遏制' => '遏制',
 '道范' => '道範',
-'逊于' => '遜於',
 '递回' => '遞迴',
 '远游' => '遠遊',
 '遨游' => '遨遊',
-'适于' => '適於',
 '遮丑' => '遮醜',
-'迁于' => '遷於',
 '选手表明' => '選手表明',
 '选手表决' => '選手表決',
 '选手表现' => '選手表現',
@@ -8366,7 +8206,6 @@ public static $zh2Hant = [
 '部落发' => '部落發',
 '郭后' => '郭后',
 '都市里' => '都市裡',
-'都于' => '都於',
 '乡愿' => '鄉愿',
 '鄉愿' => '鄉愿',
 '郑凯云' => '鄭凱云',
@@ -8384,7 +8223,6 @@ public static $zh2Hant = [
 '酸姜' => '酸薑',
 '腌制' => '醃製',
 '醇朴' => '醇樸',
-'醉于' => '醉於',
 '醋坛' => '醋罈',
 '丑丫头' => '醜丫頭',
 '丑事' => '醜事',
@@ -8411,7 +8249,6 @@ public static $zh2Hant = [
 '丑恶' => '醜惡',
 '丑态' => '醜態',
 '丑毙了' => '醜斃了',
-'丑于' => '醜於',
 '丑末' => '醜末',
 '丑样' => '醜樣',
 '丑死' => '醜死',
@@ -8450,7 +8287,6 @@ public static $zh2Hant = [
 '里海茨' => '里海茨',
 '里铺' => '里舖',
 '重回' => '重回',
-'重于' => '重於',
 '重罗面' => '重羅麵',
 '重制' => '重製',
 '重复' => '重複',
@@ -8612,16 +8448,15 @@ public static $zh2Hant = [
 '鉴察' => '鑑察',
 '鉴往知来' => '鑑往知來',
 '鉴戒' => '鑑戒',
+'鉴于' => '鑑於',
 '鉴湖' => '鑑湖',
 '鉴藏' => '鑑藏',
 '鉴谅' => '鑑諒',
 '鉴证' => '鑑證',
 '鉴识' => '鑑識',
 '鉴赏' => '鑑賞',
-'鉴于' => '鑒於',
 '長几' => '長几',
 '长几' => '長几',
-'长于' => '長於',
 '长历' => '長曆',
 '长历史' => '長歷史',
 '长发公主' => '長髮公主',
@@ -8652,7 +8487,6 @@ public static $zh2Hant = [
 '闯荡' => '闖蕩',
 '闯炼' => '闖鍊',
 '关系' => '關係',
-'关于' => '關於',
 '辟佛' => '闢佛',
 '辟作' => '闢作',
 '辟划' => '闢劃',
@@ -8670,9 +8504,7 @@ public static $zh2Hant = [
 '防御' => '防禦',
 '防范' => '防範',
 '防锈' => '防鏽',
-'阻于' => '阻於',
 '阿里' => '阿里',
-'附于' => '附於',
 '附注' => '附註',
 '限制' => '限制',
 '院里' => '院裡',
@@ -8697,11 +8529,10 @@ public static $zh2Hant = [
 '阳谷' => '陽穀',
 '隆准许' => '隆准許',
 '隆准' => '隆準',
-'é\9a\8fäº\8e' => 'é\9a¨æ\96¼',
+'é\98\9fé\87\8c' => 'é\9a\8a裡',
 '隐占' => '隱佔',
 '隐几' => '隱几',
 '隱几' => '隱几',
-'隐于' => '隱於',
 '只字' => '隻字',
 '只影' => '隻影',
 '只手遮天' => '隻手遮天',
@@ -8712,7 +8543,6 @@ public static $zh2Hant = [
 '雅范' => '雅範',
 '集团' => '集團',
 '集数里' => '集數裡',
-'集于' => '集於',
 '集里' => '集裡',
 '集游法' => '集遊法',
 '雕梁画栋' => '雕樑畫棟',
@@ -8732,9 +8562,7 @@ public static $zh2Hant = [
 '鸡腿面' => '雞腿麵',
 '鸡蛋里挑骨头' => '雞蛋裡挑骨頭',
 '鸡只' => '雞隻',
-'离于' => '離於',
 '难舍' => '難捨',
-'难于' => '難於',
 '雨蒙蒙' => '雨濛濛',
 '雪窗萤几' => '雪窗螢几',
 '雪窗螢几' => '雪窗螢几',
@@ -8750,7 +8578,6 @@ public static $zh2Hant = [
 '零个' => '零個',
 '零周后' => '零周後',
 '零天后' => '零天後',
-'零年' => '零年',
 '零只' => '零隻',
 '零余' => '零餘',
 '电子表格' => '電子表格',
@@ -8821,7 +8648,6 @@ public static $zh2Hant = [
 '頂多' => '頂多',
 '顶多' => '頂多',
 '项链' => '項鍊',
-'顺于' => '順於',
 '顺钟向' => '順鐘向',
 '顺风后' => '順風後',
 '须根据' => '須根據',
@@ -8871,7 +8697,6 @@ public static $zh2Hant = [
 '台风后' => '颱風後',
 '刮了' => '颳了',
 '刮倒' => '颳倒',
-'刮去' => '颳去',
 '刮大风' => '颳大風',
 '刮得' => '颳得',
 '刮走' => '颳走',
@@ -9345,7 +9170,6 @@ public static $zh2Hant = [
 '盐卤' => '鹽滷',
 '盐余' => '鹽餘',
 '鹿場里' => '鹿場里',
-'丽于' => '麗於',
 '麟游' => '麟遊',
 '曲酒' => '麯酒',
 '曲尘' => '麴塵',
@@ -13447,7 +13271,6 @@ public static $zh2Hans = [
 '乾,健也' => '乾,健也',
 '乾,天也' => '乾,天也',
 '五箇山' => '五箇山',
-'什么' => '什么',
 '仇讎' => '仇雠',
 '以微知著' => '以微知著',
 '仰屋著書' => '仰屋著书',
@@ -13525,7 +13348,6 @@ public static $zh2Hans = [
 '覆核' => '复核',
 '覆检' => '复检',
 '復甦' => '复苏',
-'多么' => '多么',
 '大麴' => '大曲',
 '天道为乾' => '天道为乾',
 '天道為乾' => '天道为乾',
@@ -13556,13 +13378,12 @@ public static $zh2Hans = [
 '年陞' => '年升',
 '么九' => '幺九',
 '么二三' => '幺二三',
+'么兒' => '幺儿',
 '么元' => '幺元',
 '么鳳' => '幺凤',
 '么半' => '幺半',
-'么半群' => '幺半群',
-'么廝' => '幺厮',
-'幺厮' => '幺厮',
 '么叔' => '幺叔',
+'么喝' => '幺喝',
 '么女' => '幺女',
 '么媽' => '幺妈',
 '么妹' => '幺妹',
@@ -13570,22 +13391,20 @@ public static $zh2Hans = [
 '么姨' => '幺姨',
 '么娘' => '幺娘',
 '么孃' => '幺娘',
-'幺孃' => '幺娘',
 '么子' => '幺子',
 '么小' => '幺小',
 '么弟' => '幺弟',
 '么正' => '幺正',
 '么氏' => '幺氏',
+'么爺' => '幺爷',
 '么爸' => '幺爸',
 '么爹' => '幺爹',
 '么篇' => '幺篇',
 '么舅' => '幺舅',
 '么蛾子' => '幺蛾子',
-'么謙' => '幺谦',
+'么雞' => '幺鸡',
 '么麼' => '幺麽',
-'么麽' => '幺麽',
 '幺麽' => '幺麽',
-'么麽小丑' => '幺麽小丑',
 '慶餘' => '庆馀',
 '康乾' => '康乾',
 '张法乾' => '张法乾',
@@ -13594,7 +13413,6 @@ public static $zh2Hans = [
 '待覆' => '待复',
 '後姓' => '後姓',
 '慫慂' => '怂恿',
-'怎么' => '怎么',
 '恩威並著' => '恩威并著',
 '噁心' => '恶心',
 '情蒐' => '情搜',
@@ -13821,11 +13639,8 @@ public static $zh2Hans = [
 '躊躇滿志' => '踌躇滿志',
 '較著' => '较著',
 '近角聪信' => '近角聪信',
-'这么' => '这么',
 '造麴' => '造曲',
 '遺著' => '遗著',
-'那么' => '那么',
-'那麽' => '那麽',
 '郭子乾' => '郭子乾',
 '酒麴' => '酒曲',
 '醉瀋' => '醉渖',
@@ -13889,9 +13704,8 @@ public static $zh2Hans = [
 '鬱氏' => '鬱氏',
 '魏徵' => '魏徵',
 '魚乾乾' => '鱼干干',
+'麼氏' => '麽氏',
 '麽氏' => '麽氏',
-'麼麼' => '麽麽',
-'麽麽' => '麽麽',
 '黃麴毒素' => '黄曲毒素',
 '黃潤乾' => '黄润乾',
 '黄润乾' => '黄润乾',
@@ -13940,6 +13754,7 @@ public static $zh2TW = [
 '落車' => '下車',
 '不來梅' => '不萊梅',
 '不来梅' => '不萊梅',
+'幺' => '么',
 '以太网' => '乙太網',
 '九杆' => '九桿',
 '了結他' => '了結他',
@@ -14133,8 +13948,6 @@ public static $zh2TW = [
 '发达国家' => '已開發國家',
 '巴塞罗那' => '巴塞隆納',
 '巴塞隆拿' => '巴塞隆納',
-'巴布亚新几内亚' => '巴布亞紐幾內亞',
-'巴布亞新畿內亞' => '巴布亞紐幾內亞',
 '巴士拉' => '巴斯拉',
 '巴巴多斯' => '巴貝多',
 '佈' => '布',
@@ -14155,7 +13968,6 @@ public static $zh2TW = [
 '账' => '帳',
 '干着急' => '干著急',
 '干着' => '幹著',
-'畿內亞' => '幾內亞',
 '几内亚比绍' => '幾內亞比索',
 '幾內亞比紹' => '幾內亞比索',
 '比利牛斯' => '庇里牛斯',
@@ -14218,6 +14030,8 @@ public static $zh2TW = [
 '數碼電視' => '數位電視',
 '調制解調器' => '數據機',
 '调制解调器' => '數據機',
+'斯堪的納維亞' => '斯堪地那維亞',
+'斯堪的纳维亚' => '斯堪地那維亞',
 '斯洛文尼亚' => '斯洛維尼亞',
 '斯洛文尼亞' => '斯洛維尼亞',
 '新罕布什尔' => '新罕布夏',
@@ -14376,6 +14190,7 @@ public static $zh2TW = [
 '新奥尔良' => '紐奧良',
 '新奧爾良' => '紐奧良',
 '新几内亚' => '紐幾內亞',
+'新幾內亞' => '紐幾內亞',
 '新西兰' => '紐西蘭',
 '新西蘭' => '紐西蘭',
 '紙煙' => '紙菸',
@@ -14697,7 +14512,6 @@ public static $zh2HK = [
 '·威尔士' => '·威爾士',
 '·威爾士' => '·威爾士',
 '一地里' => '一地裏',
-'一年里' => '一年裏',
 '三十六著' => '三十六着',
 '三極體' => '三極管',
 '旧金山' => '三藩市',
@@ -14723,6 +14537,7 @@ public static $zh2HK = [
 'C肝' => '丙肝',
 '并发布' => '並發佈',
 '中文里' => '中文裏',
+'幺' => '么',
 '乘著' => '乘着',
 '乘著作' => '乘著作',
 '乘著名' => '乘著名',
@@ -15387,6 +15202,7 @@ public static $zh2HK = [
 '地占' => '地佔',
 '地图里' => '地圖裏',
 '堪培拉' => '坎培拉',
+'坐台铁' => '坐台鐵',
 '坐台' => '坐枱',
 '坐著' => '坐着',
 '坐著作' => '坐著作',
@@ -15554,7 +15370,6 @@ public static $zh2HK = [
 '巴塞罗那' => '巴塞隆拿',
 '巴塞隆納' => '巴塞隆拿',
 '巴貝多' => '巴巴多斯',
-'巴布亞紐幾內亞' => '巴布亞新畿內亞',
 '巴士拉' => '巴斯拉',
 '巷里' => '巷裏',
 '市占' => '市佔',
@@ -15591,6 +15406,7 @@ public static $zh2HK = [
 '賓士' => '平治',
 '年代里' => '年代裏',
 '年里' => '年裏',
+'年里约' => '年里約',
 '干着' => '幹着',
 '幹著' => '幹着',
 '幹著名' => '幹著名',
@@ -16032,9 +15848,11 @@ public static $zh2HK = [
 '斥著者' => '斥著者',
 '斥著述' => '斥著述',
 '斥著錄' => '斥著錄',
+'斯堪地那維亞' => '斯堪的納維亞',
 '史瓦濟蘭' => '斯威士蘭',
 '斯洛維尼亞' => '斯洛文尼亞',
 '紐澳良' => '新奧爾良',
+'紐幾內亞' => '新幾內亞',
 '紐西蘭' => '新西蘭',
 '方法里' => '方法裏',
 '族里' => '族裏',
@@ -16211,6 +16029,7 @@ public static $zh2HK = [
 '殺著述' => '殺著述',
 '殺著錄' => '殺著錄',
 '壳里' => '殼裏',
+'殿里' => '殿裏',
 '茅利塔尼亞' => '毛里塔尼亞',
 '模里西斯' => '毛里裘斯',
 '毛里求斯' => '毛里裘斯',
@@ -16500,8 +16319,6 @@ public static $zh2HK = [
 '過著述' => '當著述',
 '當著錄' => '當著錄',
 '過著錄' => '當著錄',
-'几内亚' => '畿內亞',
-'幾內亞' => '畿內亞',
 '迭代' => '疊代',
 '疑著' => '疑着',
 '疑著作' => '疑著作',
@@ -16589,7 +16406,7 @@ public static $zh2HK = [
 '著法' => '着法',
 '著涼' => '着涼',
 '著火' => '着火',
-'è\91\97ç\94\9a麽' => 'ç\9d\80ç\94\9a麽',
+'è\91\97ç\94\9a麼' => 'ç\9d\80ç\94\9a麼',
 '著眼' => '着眼',
 '著祂' => '着祂',
 '著筆' => '着筆',
@@ -17496,6 +17313,7 @@ public static $zh2HK = [
 '陪著述' => '陪著述',
 '陪著錄' => '陪著錄',
 '阴沟里翻船' => '陰溝裏翻船',
+'队里' => '隊裏',
 '隔著' => '隔着',
 '隔著作' => '隔著作',
 '隔著名' => '隔著名',
@@ -18071,7 +17889,6 @@ public static $zh2CN = [
 '涼著者' => '凉著者',
 '涼著述' => '凉著述',
 '湊合著' => '凑合着',
-'畿內亞' => '几内亚',
 '幾內亞比索' => '几内亚比绍',
 '凱薩琳' => '凯瑟琳',
 '嘉芙蓮' => '凯瑟琳',
@@ -18216,6 +18033,7 @@ public static $zh2CN = [
 '叫著稱' => '叫著称',
 '叫著者' => '叫著者',
 '叫著述' => '叫著述',
+'台北韓' => '台北韩',
 '桌上型電腦' => '台式电脑',
 '撞球' => '台球',
 '台帳' => '台账',
@@ -18503,7 +18321,6 @@ public static $zh2CN = [
 '巴斯拉' => '巴士拉',
 '帕邁拉環礁' => '巴尔米拉环礁',
 '巴貝多' => '巴巴多斯',
-'巴布亞紐幾內亞' => '巴布亚新几内亚',
 '布殊' => '布什',
 '布吉納法索' => '布基纳法索',
 '布隆泉' => '布隆方丹',
@@ -18985,6 +18802,7 @@ public static $zh2CN = [
 '斥著者' => '斥著者',
 '斥著述' => '斥著述',
 '史丹福大學' => '斯坦福大学',
+'斯堪地那維亞' => '斯堪的纳维亚',
 '史達林' => '斯大林',
 '史瓦濟蘭' => '斯威士兰',
 '斯洛維尼亞' => '斯洛文尼亚',
@@ -19420,8 +19238,8 @@ public static $zh2CN = [
 '著絲' => '着丝',
 '著麼' => '着么',
 '著人' => '着人',
-'著什麼' => '着什么',
-'è\91\97ç\94\9a麽' => '着什么',
+'著什' => '着什',
+'è\91\97ç\94\9a麼' => '着什么',
 '著他' => '着他',
 '著令' => '着令',
 '著位' => '着位',
@@ -20066,6 +19884,7 @@ public static $zh2CN = [
 '軟體' => '软件',
 '軟體動物' => '软体动物',
 '軟體家具' => '软体家具',
+'軟體生物' => '软体生物',
 '軟碟機' => '软驱',
 '載著' => '载着',
 '載著書' => '载著书',
index 50620b1..e127f8b 100644 (file)
@@ -15,7 +15,7 @@
                        "ו$1"
                ],
                [
-                       "ה(.+)$",
+                       "^ה(.+)$",
                        "$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 794eae2..90b5be8 100644 (file)
        "editfont-monospace": "خط ثابت العرض",
        "editfont-sansserif": "خط بلا زوائد",
        "editfont-serif": "خط بزوائد",
+       "sunday": "الأحد",
+       "tuesday": "الثلاث",
+       "wednesday": "الأربعا",
+       "thursday": "الخميس",
+       "friday": "الجمعة",
+       "saturday": "السبت",
+       "sun": "الأحد",
+       "mon": "الإثنين",
+       "tue": "الثلاث",
+       "wed": "الأربعا",
+       "thu": "الخميس",
+       "fri": "الجمعة",
+       "sat": "السبت",
+       "january": "جانفي",
+       "february": "فيڥري",
+       "march": "مارس",
+       "april": "أڥريل",
+       "may_long": "ماي",
+       "june": "جوان",
+       "july": "جويلية",
+       "august": "أوت",
+       "september": "سبتمبر",
+       "october": "أكتوبر",
+       "november": "نوڥمبر",
+       "december": "ديسمبر",
+       "january-gen": "جانفي",
+       "february-gen": "فيڥري",
+       "march-gen": "مارس",
+       "april-gen": "أڥريل",
+       "may-gen": "ماي",
+       "june-gen": "جوان",
+       "july-gen": "جويلية",
+       "august-gen": "أوت",
+       "september-gen": "سبتمبر",
+       "october-gen": "أكتوبر",
+       "november-gen": "نوڥمبر",
+       "december-gen": "ديسمبر",
+       "jan": "جانفي",
+       "feb": "فيڥري",
+       "mar": "مارس",
+       "apr": "أڥريل",
+       "may": "ماي",
+       "jun": "جوان",
+       "jul": "جويلية",
+       "aug": "أوت",
+       "sep": "سبتمبر",
+       "oct": "أكتوبر",
+       "nov": "نوڥمبر",
+       "dec": "ديسمبر",
        "category_header": "صفحات تصنيف \"$1\"",
        "subcategories": "التصنيفات الفرعية",
        "category-media-header": "الوسائط في التصنيف \"$1\"",
        "broken-file-category": "صفحات تحتوي وصلات ملفات معطوبة",
        "about": "عن",
        "article": "صفحة محتوى",
-       "newwindow": "(تفتح في نافذة جديدة)",
+       "newwindow": "(تتحلّ في شبّاك جديد)",
+       "cancel": "بطّل",
        "mypage": "صفحتي",
        "mytalk": "نقاشي",
+       "returnto": "إرجع لـ$1",
+       "tagline": "من {{SITENAME}}",
+       "help": "معاونة",
+       "search": "لوّج",
+       "searchbutton": "لوّج",
+       "searcharticle": "إمشي",
+       "history": "تاريخ الپاج",
+       "history_short": "التاريخ",
+       "view": "شوفة",
+       "view-foreign": "ورّي على $1",
+       "edit": "بدّل",
+       "talkpagelinktext": "پاج الحديث",
+       "talk": "حديث",
+       "views": "شوفات",
+       "otherlanguages": "في لغات أخرين",
+       "redirectto": "تحويل لـ:",
+       "lastmodifiedat": "آخر تبديل لهذي الپاج كان نهار $1 في $2.",
+       "jumpto": "إمشي لـ:",
+       "jumptosearch": "لوّج",
+       "aboutsite": "على {{SITENAME}}",
        "copyright": "المحتوى متوفر تحت $1.",
+       "edithelp": "معاونة باش تبدّل پاج",
+       "mainpage": "الپاج الأولانيّة",
+       "mainpage-description": "الپاج الأولانيّة",
        "badaccess": "خطأ في السماح",
        "badaccess-group0": "ليس من المسموح لك تنفيذ الفعل الذي طلبته.",
        "badaccess-groups": "الفعل الذي طلبته مقصور على المستخدمين في {{PLURAL:$2||مجموعة|واحدة من مجموعتي|واحدة من مجموعات}}: $1.",
        "versionrequiredtext": "تلزم النسخة $1 من ميدياويكي لاستعمال هذه الصفحة. انظر [[Special:Version|صفحة النسخة]]",
        "youhavenewmessages": "توجد لديك $1 ($2).",
        "youhavenewmessagesmulti": "لديك رسائل جديدة على $1",
+       "editsection": "بدّل",
+       "editlink": "بدّل",
+       "viewsourcelink": "شوف المصدر",
+       "editsectionhint": "بدّل الطرف: $1",
        "viewdeleted": "أأعرض $1؟",
        "restorelink": "{{PLURAL:$1|$1 تعديل محذوف|تعديلا واحدا محذوفا|تعديلين محذوفين|$1 تعديلات محذوفة|$1 تعديلا محذوفا|$1 تعديلا محذوفا}}",
        "feedlinks": "التغذية:",
        "site-rss-feed": "$1 تلقيم أر إس إس",
        "page-rss-feed": "\"$1\" تلقيم أر إس إس",
        "page-atom-feed": "$1 تلقيم أتوم",
+       "red-link-title": "$1 (الپاج ما فمّاش)",
        "sort-descending": "ترتيب تنازلي",
        "sort-ascending": "ترتيب تصاعدي",
+       "nstab-main": "الپاج",
        "nstab-user": "صفحة مستخدم",
        "nstab-media": "صفحة وسيط",
-       "nstab-project": "صفحة مشروع",
+       "nstab-project": "پاج مشروع",
+       "nstab-image": "فيشياي",
        "nstab-template": "قالب",
        "nstab-help": "صفحة مساعدة",
        "nstab-category": "تصنيف",
+       "mainpage-nstab": "الپاج الأولانيّة",
        "nosuchaction": "لا يوجد فعل كهذا",
        "nosuchactiontext": "الفعل المحدد بواسطة المسار غير صحيح.\nربما تكون قد كتبت المسار بطريقة غير صحيحة، أو اتبعت وصلة غير صحيحة.\nهذا ربما يشير أيضا إلى علة في {{SITENAME}}.",
        "nosuchspecialpage": "لا توجد صفحة خاصة بهذا الاسم",
        "logouttext": "'''أنت الآن غير مسجل الدخول.'''\n\nتستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو <span class='plainlinks'>[$1 الدخول مرة أخرى]</span> بنفس الاسم أو باسم آخر.\nمن الممكن أن ترى بعض الصفحات كما لو أنك مسجل الدخول، وذلك حتى تقوم بإفراغ الصفحات المختزنة في المتصفح لديك.",
        "yourname": "اسم المستخدم:",
        "yourpassword": "كلمة السر:",
+       "userlogin-yourpassword-ph": "دخّل كلمة السر",
+       "createacct-yourpassword-ph": "دخّل كلمة السر",
        "yourpasswordagain": "أعد كتابة كلمة السر:",
+       "createacct-yourpasswordagain-ph": "دخّل كلمة السر مرة أخرى",
        "yourdomainname": "نطاقك:",
        "externaldberror": "هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.",
        "login": "ادخل",
        "gotaccount": "تمتلك حسابا بالفعل؟ '''$1'''.",
        "gotaccountlink": "ادخل",
        "userlogin-resetlink": "أنسيت بيانات الولوج؟",
+       "createacct-emailoptional": "الإيمايل (إختياري)",
+       "createacct-email-ph": "دخّل الإيمايل متاعك",
        "createaccountmail": "بواسطة البريد الإلكتروني",
        "createaccountreason": "السبب:",
+       "createacct-submit": "أعمل الحساب",
+       "createacct-benefit-heading": "{{SITENAME}} إتّعمل بعباد كيفك.",
+       "createacct-benefit-body3": "آخر {{PLURAL:$1|مساهم|مساهمين}}",
        "badretype": "كلمات السر التي أدخلتها لا تتطابق.",
        "userexists": "اسم المستخدم الذي تم إدخاله مستعمل بالفعل.\nالرجاء اختيار اسم مختلف.",
        "loginerror": "خطأ في الدخول",
        "login-abort-generic": "لم ينجح ولوجك - إجهاض",
        "loginlanguagelabel": "اللغة: $1",
        "suspicious-userlogout": "رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.",
-       "pt-login": "Odkul",
+       "pt-login": "أدخل",
+       "pt-createaccount": "أعمل حساب",
+       "pt-userlogout": "أخرج",
        "php-mail-error-unknown": "خطأ غير معروف في وظيفة البريد PHP's mail()",
        "user-mail-no-addy": "لقد حاولت إرسال بريد إلكتروني دون عنوان بريد إلكتروني.",
        "resetpass_announce": "تم تسجيل دخولك بكلمة سر مؤقتة.\nللدخول بشكل نهائي، يجب عليك ضبط كلمة سر جديدة هنا:",
        "resetpass-submit-loggedin": "تغيير كلمة السر",
        "resetpass-wrong-oldpass": "كلمة سر حالية أو مؤقتة غير صحيحة.\nربما تكون غيرت كلمة السر الخاصة بك بنجاح أو طلبت كلمة سر مؤقتة جديدة.",
        "resetpass-temp-password": "كلمة سر مؤقتة:",
-       "passwordreset": "إعادة Ø¶Ø¨Ø· كلمة السر",
+       "passwordreset": "تبدÙ\8aÙ\84 كلمة السر",
        "passwordreset-disabled": "عُطّلت إعادة تعيين كلمة السر على هذه الويكي.",
        "passwordreset-username": "اسم المستخدم:",
        "passwordreset-domain": "النطاق:",
-       "passwordreset-capture": "أأعرض البريد الإلكتروني الناتج؟",
-       "passwordreset-capture-help": "إذا علّمت هذا الصندوق فسيعرض لك البريد الإلكتروني (الذي يحتوي كلمة سر مؤقتة) وسيرسل أيضا للمستخدم.",
        "passwordreset-email": "عنوان البريد الإلكتروني:",
        "passwordreset-emailtitle": "تفاصيل حساب {{SITENAME}}",
        "passwordreset-emailtext-ip": "احد ما (قد يكون انت$1)طلب مذكرة تفاصيل الحساب ل{{SITENAME}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :\n\n$2\n\n{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي في {{PLURAL:$5|يوم|ايام$5 }}\nمن الافضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .\nإذا قام شخص آخر بهذا الطلب، أو إذا  تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب في تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام  كلمة المرورالقديمة.",
        "savearticle": "احفظ الصفحة",
        "preview": "معاينة",
        "showpreview": "أظهر معاينة",
-       "showdiff": "أظهر التغييرات",
+       "showdiff": "ورّي التبديلات",
        "anoneditwarning": "'''تحذير:''' لم تقم بالدخول.\nسيسجل عنوان الآيبي خاصتك في تاريخ هذه الصفحة.",
        "anonpreviewwarning": "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
        "missingsummary": "'''تنبيه:''' لم تقم بكتابة ملخص للتعديل.\nإذا قمت بضغط حفظ الصفحة مرة أخرى، فيتم حفظ تعديلك بدون ملخص.",
        "session_fail_preview_html": "'''عذرا! لم نستطع معالجة تعديلك بسبب فقدان بيانات الجلسة.'''\n\n''لأن {{SITENAME}} بها HTML الخام مفعلة، العرض المسبق مخفي كاحتياط ضد هجمات الجافا سكريبت.''\n\n'''إذا كانت هذه محاولة تعديل صادقة، من فضلك حاول مرة أخرى.\nإذا كانت مازالت لا تعمل، حاول [[Special:UserLogout|تسجيل الخروج]] ثم تسجيل الدخول مجددا.'''",
        "token_suffix_mismatch": "'''تعديلك تم رفضه لأن عميلك أخطأ في علامات الترقيم\nفي نص التعديل. تم رفض التعديل لمنع فساد نص المقالة.\nهذا يحدث أحيانا عندما تستخدم خدمة بروكسي مجهول معيبة مبنية على الوب.'''",
        "edit_form_incomplete": "'''بعض أجزاء من نموذج التعديل لم تصل إلى الخادم؛ تأكد من أن تعديلاتك لم تمس وحاول مجددا.'''",
-       "editing": "تحرÙ\8aر $1",
-       "creating": "Ø¥Ù\86شاء «$1»",
-       "editingsection": "تحرÙ\8aر $1 (Ù\82سÙ\85)",
+       "editing": "تبدÙ\8aÙ\84 $1",
+       "creating": "عÙ\85Ù\84اÙ\86 «$1»",
+       "editingsection": "تبدÙ\8aÙ\84 $1 (طرÙ\81)",
        "editingcomment": "تعديل $1 (قسم جديد)",
        "editconflict": "تضارب في التحرير: $1",
        "explainconflict": "لقد عدل شخص آخر هذه الصفحة بعد أن بدأت أنت بتحريرها.\nصندوق النصوص العلوي يحتوي على النص الموجود حاليا في الصفحة.\nوالتغييرات التي قمت أنت بها موجودة في الصندوق في أسفل الصفحة.\nيجب أن تقوم بدمج تغييراتك في النص الموجود حاليا.\n'''فقط''' ما هو موجود في الصندوق العلوي هو ما سيتم حفظه عند الضغط على زر \"حفظ الصفحة\".",
        "semiprotectedpagewarning": "'''ملاحظة:''' تمت حماية هذه الصفحة بحيث يمكن للمستخدمين المسجلين فقط تعديلها.\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
        "cascadeprotectedwarning": "'''تحذير:''' تمت حماية هذه الصفحة بحيث يستطيع المستخدمون ذوو الصلاحيات الإدارية فقط تعديلها، وذلك لأنها مدمجة في {{PLURAL:$1||الصفحة التالية والتي تمت حمايتها|الصفحتين التاليتين واللتين تمت حمايتها|الصفحات التالية والتي تمت حمايتها}} بخاصية \"حماية الصفحات المدمجة\":",
        "titleprotectedwarning": "'''تحذير:  هذه الصفحة تمت حمايتها بحيث أن [[Special:ListGroupRights|صلاحيات معينة]] مطلوبة لإنشائها.'''\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
-       "templatesused": "{{PLURAL:$1||اÙ\84Ù\82اÙ\84ب Ø§Ù\84Ù\85ستخدÙ\85|اÙ\84Ù\82اÙ\84باÙ\86 Ø§Ù\84Ù\85ستخدÙ\85اÙ\86|اÙ\84Ù\82Ù\88اÙ\84ب Ø§Ù\84Ù\85ستخدÙ\85Ø©}} Ù\81Ù\8a Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة:",
+       "templatesused": "{{PLURAL:$1||اÙ\84Ù\82اÙ\84ب Ø§Ù\84Ù\85ستعÙ\85Ù\84Ø©|اÙ\84Ù\82Ù\88اÙ\84ب Ø§Ù\84Ù\85ستعÙ\85Ù\84Ø©}} Ù\81Ù\8a Ù\87Ø°Ù\8a Ø§Ù\84پاج:",
        "templatesusedpreview": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه المعاينة:",
        "templatesusedsection": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذا القسم:",
+       "template-protected": "(محمي)",
        "template-semiprotected": "(حماية جزئية)",
        "hiddencategories": "{{PLURAL:$1|هذه الصفحة غير موجودة في أي تصنايف مخفية|هذه الصفحة موجودة في تصنيف مخفي واحد|هذه الصفحة موجودة في تصنيفين مخفيين|هذه الصفحة موجودة في $1 تصانيف مخفية|هذه الصفحة موجودة في $1 تصنيفا مخفيا|هذه الصفحة موجودة في $1 تصنيف مخفي}}:",
        "nocreatetext": "قام {{SITENAME}} بتحديد القدرة على إنشاء صفحات جديدة.\nيمكنك العودة وتحرير صفحة موجودة بالفعل، أو [[Special:UserLogin|الدخول أو تسجيل حساب]].",
        "sectioneditnotsupported-text": "تعديل الأقسام غير مدعوم في هذه الصفحة",
        "permissionserrors": "أخطاء السماحات",
        "permissionserrorstext": "لا تمتلك الصلاحية لفعل هذا، {{PLURAL:$1||للسبب التالي|للسببين التاليين|للأسباب التالية}}:",
-       "permissionserrorstext-withaction": "Ù\84ا ØªÙ\85Ù\84Ù\83 Ø§Ù\84صÙ\84احÙ\8aات Ù\84$2Ø\8c Ù\84Ù\84{{PLURAL:$1||سبب Ø§Ù\84تاÙ\84Ù\8a|سببÙ\8aÙ\86 Ø§Ù\84تاÙ\84Ù\8aÙ\8aÙ\86|أسباب Ø§Ù\84تاÙ\84Ù\8aØ©}}:",
+       "permissionserrorstext-withaction": "Ù\85ا Ø¹Ù\86دÙ\83Ø´ Ø§Ù\84Ø­Ù\82 Ø¨Ø´ $2Ø\8c Ø¹Ù\84Ù\89 Ø®Ø§Ø·Ø±{{PLURAL:$1||Ù\87ا Ø§Ù\84سبب|Ù\87ا Ø§Ù\84أسباب}}:",
        "recreate-moveddeleted-warn": "'''تحذير: أنت تقوم بإعادة إنشاء صفحة سبق حذفها.'''\n\nيجب عليك التيقن من أن الاستمرار بتحرير هذه الصفحة ملائم.\nسجلا الحذف والنقل لهذه الصفحة معروضان هنا للتيسير:",
-       "moveddeleted-notice": "Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة ØªÙ\85 Ø­Ø°Ù\81Ù\87ا.\nسجلا الحذف والنقل للصفحة معروضان بالأسفل كمرجع.",
+       "moveddeleted-notice": "Ù\87ا Ø§Ù\84پاج ØªÙ\81سخت.\nسجلا الحذف والنقل للصفحة معروضان بالأسفل كمرجع.",
        "log-fulllog": "أظهر السجل الكامل",
        "edit-hook-aborted": "التعديل تم تركه بواسطة الخطاف.\nلم يعط تفسيرا.",
        "edit-gone-missing": "لم يمكن تحديث الصفحة.\nيبدو أنه تم حذفها.",
        "currentrev-asof": "المراجعة الحالية بتاريخ $1",
        "revision-info": "مراجعة $1 بواسطة $2",
        "previousrevision": "→ مراجعة أقدم",
-       "nextrevision": "Ù\85راجعة Ø£Ø­Ø¯Ø« ←",
+       "nextrevision": "Ù\85راجعة Ø£Ø¬Ø¯Ø¯ ←",
        "currentrevisionlink": "المراجعة الحالية",
        "cur": "الحالي",
        "next": "التالي",
        "rev-suppressed-unhide-diff": "'''أُخفيت''' إحدى مراجعتي هذا الفرق.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
        "rev-deleted-diff-view": "'''حُذِفت''' إحدى مراجعتي هذا الفرق.\nيمكنك رؤية الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
        "rev-suppressed-diff-view": "'''أُخفيت''' إحدى مراجعتي هذا الفرق.\nيمكنك رؤية هذا الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
-       "rev-delundel": "أظÙ\87ر/أخÙ\81",
+       "rev-delundel": "ظÙ\87Ù\91ر/خبÙ\91Ù\8a",
        "rev-showdeleted": "أظهر",
        "revisiondelete": "حذف/استرجاع المراجعات",
        "revdelete-nooldid-title": "مراجعة هدف غير صحيحة",
        "revertmerge": "إلغاء الدمج",
        "mergelogpagetext": "بالأسفل قائمة بأحدث عمليات الدمج لتاريخ صفحة ما إلى أخرى.",
        "history-title": " «$1»: تاريخ المراجعة",
-       "difference-title": "«$1»: الفرق بين المراجعتين",
+       "difference-title": "«$1»: الفرق بينات المراجعتين",
        "difference-title-multipage": "«$1» و«$2»: الفرق بين الصفحتين",
        "difference-multipage": "(الفرق بين الصفحتين)",
-       "lineno": "Sţar $1:",
+       "lineno": "سطر $1:",
        "compareselectedversions": "قارن بين النسختين المختارتين",
        "showhideselectedversions": "أظهر/أخف المراجعات المختارة",
+       "editundo": "نحّي",
        "diff-multi-manyusers": "({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)",
-       "prevn": "{{PLURAL:$1|$1}} السابقة",
-       "nextn": "{{PLURAL:$1|$1}} التالية",
+       "searchresults": "نتايج التلويج",
+       "prevn": "{{PLURAL:$1|$1}} الفايتة",
+       "nextn": "{{PLURAL:$1|$1}} الجاية",
        "prevn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
        "nextn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
        "searchmenu-new": "'''أنشئ الصفحة \"[[:$1]]\" في هذا الويكي!'''",
+       "searchprofile-everything": "كلّ شي",
+       "searchprofile-articles-tooltip": "لوّج في $1",
+       "searchprofile-images-tooltip": "لوّج عالتصاور",
        "search-result-category-size": "{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوًا|$1 عضو}} ({{PLURAL:$2|لا تصانيف فرعية|تصنيف فرعي واحد|تصنيفان فرعيان|$2 تصنيفات فرعية|$2 تصنيفًا فرعيًا|$2 تصنيف فرعي}} و{{PLURAL:$3|لا ملفات|ملف واحد|ملفان|$3 ملفات|$3 ملفًا|$3 ملف}})",
        "search-redirect": "(تحويلة $1)",
-       "search-suggest": "Ù\87Ù\84 كنت تقصد: $1",
+       "search-suggest": "Ù\8aاخÙ\8a كنت تقصد: $1",
        "searchrelated": "مرتبطة",
        "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
        "mypreferences": "تفضيلاتي",
        "prefs-help-email-others": "يمكنك أيضا اختيار للسماح للآخرين الاتصال بك عن طريق صفحة المستخدم أو نقاش المستخدم الخاص بك دون الحاجة إلى الكشف عن الهوية الخاصة بك.",
        "newuserlogpage": "سجل إنشاء المستخدمين",
        "nchanges": "{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}",
+       "enhancedrc-history": "تاريخ",
+       "recentchanges": "التبديلات الجدد",
        "recentchanges-legend": "خيارات أحدث التغييرات",
        "recentchanges-summary": "تابع أحدث التغييرات للويكي عبر هذه التلقيمة.",
        "recentchanges-feed-description": "تابع أحدث التغييرات للويكي عبر هذه التلقيمة.",
-       "recentchanges-label-newpage": "Ø£Ù\86شأ Ù\87ذا Ø§Ù\84تعدÙ\8aÙ\84 ØµÙ\81حة جديدة",
-       "recentchanges-label-minor": "Ù\87ذا ØªØ¹Ø¯Ù\8aÙ\84 Ø·Ù\81Ù\8aÙ\81",
-       "recentchanges-label-bot": "أجرÙ\89 Ù\87ذا Ø§Ù\84تعديل بوت",
+       "recentchanges-label-newpage": "عÙ\85Ù\84 Ù\87ذا Ø§Ù\84تبدÙ\8aÙ\84 Ù¾Ø§Ø¬ جديدة",
+       "recentchanges-label-minor": "Ù\87ذا ØªØ¨Ø¯Ù\8aÙ\84 ØµØºÙ\8aر",
+       "recentchanges-label-bot": "عÙ\85Ù\84 Ù\87ذا Ø§Ù\84تبديل بوت",
        "recentchanges-label-unpatrolled": "لم يراجع هذا التعديل إلى الآن",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (شوف زادة [[Special:NewPages|ليستة الپاجات الجدد]])",
        "rcnotefrom": "بالأسفل التغييرات منذ '''$2''' (إلى '''$1''' معروضة).",
-       "rclistfrom": "أظهر التغييرات بدءا من $3 $2",
+       "rclistfrom": "ورّي التبديلات بدءا من $3 $2",
        "rcshowhideminor": "$1 التعديلات الطفيفة",
+       "rcshowhideminor-hide": "خبّي",
        "rcshowhidebots": "$1 البوتات",
+       "rcshowhidebots-show": "ورّي",
        "rcshowhideliu": "$1 المستخدمين المسجلين",
+       "rcshowhideliu-hide": "خبّي",
        "rcshowhideanons": "$1 المستخدمين المجهولين",
+       "rcshowhideanons-hide": "خبّي",
        "rcshowhidepatr": "$1 التعديلات المراجعة",
        "rcshowhidemine": "$1 تعديلاتي",
+       "rcshowhidemine-hide": "خبّي",
        "rclinks": "أظهر آخر $1 تعديل في آخر $2 يوم<br />$3",
+       "hist": "تاريخ",
        "hide": "أخف",
-       "show": "اعرض",
+       "show": "ورّي",
+       "minoreditletter": "ص",
+       "newpageletter": "ج‌",
+       "boteditletter": "ب",
+       "rc-change-size-new": "$1 {{PLURAL:$1|أوكتاي|أوكتاي}} بعد التبديل",
        "rc-enhanced-expand": "عرض التفاصيل (يتطلب جافاسكريبت)",
        "rc-enhanced-hide": "أخفِ التفاصيل",
        "recentchangeslinked": "تغييرات ذات علاقة",
        "recentchangeslinked-title": "التغييرات المرتبطة ب \"$1\"",
-       "recentchangeslinked-summary": "Ù\87Ø°Ù\87 Ù\82ائÙ\85Ø© Ø¨Ø§Ù\84تغÙ\8aÙ\8aرات Ø§Ù\84تÙ\8a ØªÙ\85ت Ø­Ø¯Ù\8aثاÙ\8b Ù\84Ù\84صÙ\81حات Ø§Ù\84Ù\85Ù\88صÙ\88Ù\84Ø© Ù\85Ù\86 ØµÙ\81حة Ù\85عÙ\8aÙ\86Ø© (Ø£Ù\88 Ø¥Ù\84Ù\89 Ø§Ù\84أعضاء Ø¶Ù\85Ù\86 ØªØµÙ\86Ù\8aÙ\81 Ù\85عÙ\8aÙ\86).\nاÙ\84صÙ\81حات Ù\81Ù\8a [[Special:Watchlist|Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\83]] '''عرÙ\8aضة'''",
-       "recentchangeslinked-page": "اسÙ\85 Ø§Ù\84صÙ\81حة:",
+       "recentchangeslinked-summary": "Ù\87Ø°Ù\8a Ù\84Ù\8aستة Ø¨Ø§Ù\84تبدÙ\8aÙ\84ات Ø¥Ù\84Ù\91Ù\8a ØµØ§Ø±Ù\88ا Ù\85ا ØµØ§Ø±Ù\84Ù\87Ù\85Ø´ Ø¨Ø±Ø´Ø§ Ù\84Ù\84پاجات Ø¥Ù\84Ù\91Ù\8a Ù\85Ù\88جÙ\88د Ù\84Ù\8aاÙ\86 Ù\8aدÙ\91Ù\8a Ù\84Ù\8aÙ\87Ù\85 Ù\81Ù\8a Ù¾Ø§Ø¬ Ø¨Ø°Ø§ØªÙ\87ا (Ù\88Ù\84Ù\91ا Ù\81Ù\8a Ù¾Ø§Ø¬ Ù\85تاع ØªØµÙ\86Ù\8aÙ\81 Ù\85عÙ\8aÙ\86).\nاÙ\84پاجات Ù\81Ù\8a [[Special:Watchlist|Ù\84Ù\8aستة Ø§Ù\84پاجات Ø¥Ù\84Ù\91Ù\8a ØªÙ\91بعÙ\87ا]] '''Ù\85Ù\83تÙ\88بÙ\8aÙ\86 Ø¨Ø§Ù\84غÙ\84Ù\8aظ'''",
+       "recentchangeslinked-page": "إسÙ\85 Ø§Ù\84پاج:",
        "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضاً عن ذلك",
+       "upload": "صبّ فشياي",
        "uploadlogpage": "سجل الرفع",
        "filedesc": "ملخص:",
        "license": "ترخيص:",
+       "file-anchor-link": "فيشياي",
+       "filehist": "تاريخ الپاج",
        "filehist-help": "اضغط على وقت/زمن لرؤية الملف كما بدا في هذا الزمن.",
        "filehist-revert": "استرجع",
        "filehist-current": "حالي",
        "filehist-thumbtext": "تصغير للنسخة بتاريخ $1",
        "filehist-user": "مستخدم",
        "filehist-dimensions": "الأبعاد",
-       "imagelinks": "استخدام الملف",
+       "filehist-comment": "تعليق",
+       "imagelinks": "استعمال الدوسي",
        "linkstoimage": "{{PLURAL:$1||الصفحة التالية تصل|الصفحتان التاليتان تصلان|ال$1 صفحات التالية تصل|ال$1 صفحة التالية تصل}} إلى هذا الملف:",
        "nolinkstoimage": "لا توجد صفحات تصل لهذا الملف.",
        "sharedupload-desc-here": "هذا الملف من $1 ويمكن استخدامه بواسطة المشاريع الأخرى.\nالوصف على [$2 صفحة وصف الملف] هناك معروض بالأسفل.",
+       "upload-disallowed-here": "ما تنجّمش تبدّل هذي التصويرة.",
        "statistics": "إحصاءات",
-       "nmembers": "{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوا|$1 عضو}}",
+       "nmembers": "{{PLURAL:$1|حتى عضو|عضو واحد||زوز أعضاء|$1 عضو}}",
        "prefixindex": "كل الصفحات بالبادئة",
        "usercreated": "{{GENDER:$3|أنشأه|أنشأته}} في $1 الساعة $2",
+       "newpages": "پاجات جدد",
        "move": "انقل",
        "pager-newer-n": "{{PLURAL:$1|أقدم 1|أقدم $1}}",
        "pager-older-n": "{{PLURAL:$1|أقدم 1|أقدم $1}}",
        "booksources": "مصادر كتاب",
-       "booksources-search-legend": "اÙ\84بحث Ø¹Ù\86 مصادر الكتب",
+       "booksources-search-legend": "اÙ\84تÙ\84Ù\88Ù\8aج Ø¹Ù\84Ù\89 مصادر الكتب",
        "log": "سجلات",
        "allpagessubmit": "اذهب",
        "categories": "تصنيفات",
        "listgrouprights-members": "(قائمة الأعضاء)",
        "emailuser": "إرسال رسالة لهذا المستخدم",
        "watchlist": "قائمة مراقبتي",
-       "mywatchlist": "Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\8a",
+       "mywatchlist": "Ù\84Ù\8aستة Ø§Ù\84پاجات Ø¥Ù\84Ù\91Ù\8a Ù\86تبÙ\91عÙ\87ا",
        "watchlistfor2": "ل$1 $2",
        "watch": "راقب",
        "unwatch": "أوقف المراقبة",
        "actioncomplete": "انتهاء العملية",
        "actionfailed": "الفعل فشل",
        "dellogpage": "سجل الحذف",
+       "rollbacklink": "رجّع",
        "protectlogpage": "سجل الحماية",
        "protectedarticle": "حمى \"[[$1]]\"",
        "undeletelink": "اعرض/استعد",
        "undeleteviewlink": "اعرض",
        "namespace": "النطاق",
        "invert": "اعكس الاختيار",
-       "contributions": "مساهماتي",
+       "blanknamespace": "(رئيسي)",
+       "contributions": "مساهمات {{GENDER:$1|المستعمل|المستعملة}}",
        "contributions-title": "مساهمات المستخدم $1",
        "mycontris": "مساهماتي",
+       "anoncontribs": "مساهمات",
        "contribsub2": "ل$1 ($2)",
-       "month": "Ù\85Ù\86 Ø³Ù\86Ø© (Ù\88أقدم):",
-       "year": "Ù\85Ù\86 Ø³Ù\86Ø© (Ù\88أقدم):",
+       "month": "Ù\85Ù\86 Ø´Ù\87ر (Ù\88 أقدم):",
+       "year": "Ù\85Ù\86 Ø¹Ø§Ù\85 (Ù\88 أقدم):",
        "sp-contributions-newbies": "اعرض مساهمات الحسابات الجديدة فقط",
        "sp-contributions-blocklog": "سجل المنع",
        "sp-contributions-uploads": "مرفوعات",
        "sp-contributions-username": "عنوان أيبي أو اسم مستخدم:",
        "sp-contributions-toponly": "أظهر أعلى المراجعات فقط",
        "whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
+       "whatlinkshere-page": "الپاج:",
        "linkshere": "الصفحات التالية تصل إلى '''[[:$1]]''':",
        "nolinkshere": "لا توجد صفحات تصل إلى '''[[:$1]]'''.",
        "isredirect": "صفحة تحويل",
        "isimage": "وصلة ملف",
        "whatlinkshere-next": "{{PLURAL:$1|التالية|ال$1 التالية}}",
        "whatlinkshere-links": "← وصلات",
-       "whatlinkshere-hideredirs": "$1 Ø§Ù\84تحÙ\88Ù\8aÙ\84ات",
+       "whatlinkshere-hideredirs": "$1 تحويلات",
        "whatlinkshere-hidetrans": "$1 التضمينات",
-       "whatlinkshere-hidelinks": "$1 الوصلات",
+       "whatlinkshere-hidelinks": "$1 ليانات",
        "whatlinkshere-hideimages": "$1 وصلة صورة",
        "whatlinkshere-filters": "مرشحات",
        "ipboptions": "ساعتين:2 hours,يوم واحد:1 day,3 أيام:3 days,أسبوع واحد:1 week,أسبوعين:2 weeks,شهر واحد:1 month,3 أشهر:3 months,6 أشهر:6 months,سنة واحدة:1 year,دائم:infinite",
        "ipblocklist": "المستخدمون الممنوعون",
+       "blocklink": "بلوكي",
        "unblocklink": "ارفع المنع",
        "change-blocklink": "تغيير المنع",
        "blocklogpage": "سجل المنع",
        "blocklogentry": "منع \"[[$1]]\" لفترة زمنية مدتها $2 $3",
        "block-log-flags-nocreate": "إنشاء الحسابات ممنوع",
-       "movelogpage": "سجل النقل",
+       "movelogpage": "سجل التحويل",
        "revertmove": "استرجع",
        "export": "تصدير صفحات",
        "allmessagesname": "الاسم",
        "tooltip-pt-preferences": "تفضيلاتي",
        "tooltip-pt-watchlist": "قائمة الصفحات التي تراقب التغييرات التي تحدث بها",
        "tooltip-pt-mycontris": "قائمة مساهماتك",
+       "tooltip-pt-login": "ماذابيك لوكان تدخل للويكي، أما موش لازمك تعمل هكّا",
        "tooltip-pt-logout": "خروج",
+       "tooltip-pt-createaccount": "ماذابيك لوكان تعمل حساب و تدخل للويكي، أما موش لازمك تعمل هكّا",
+       "tooltip-ca-edit": "بدّل الپاج",
        "tooltip-ca-addsection": "ابدأ قسما جديدا",
+       "tooltip-ca-viewsource": "هذه الپاج محمية.\nتنجّم تشوف مصدرها.",
        "tooltip-ca-protect": "احم هذه الصفحة",
        "tooltip-ca-delete": "احذف هذه الصفحة",
-       "tooltip-ca-move": "عÙ\84Ù\85 Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة",
-       "tooltip-ca-watch": "أضÙ\81 Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة Ø¥Ù\84Ù\89 Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\83",
+       "tooltip-ca-move": "Ø­Ù\88Ù\91Ù\84 Ù\87Ø°Ù\8a Ø§Ù\84پاج",
+       "tooltip-ca-watch": "زÙ\8aد Ù\87ا Ø§Ù\84پاج Ù\84Ù\84Ù\8aستة Ø§Ù\84پاجات Ø¥Ù\84Ù\91Ù\8a ØªÙ\91بعÙ\87ا",
        "tooltip-ca-unwatch": "أزل هذه الصفحة من قائمة مراقبتك",
+       "tooltip-search": "لوّج في {{SITENAME}}",
+       "tooltip-search-go": "إمشي للپاج إلّي عندها هذا الإسم بالضبط إذا هي موجودة",
+       "tooltip-p-logo": "شوف الپاج الأولانيّة",
+       "tooltip-n-mainpage": "شوف الپاج الأولانيّة",
+       "tooltip-n-mainpage-description": "شوف الپاج الأولانيّة",
+       "tooltip-n-randompage": "خرّج پاج بالزهر",
        "tooltip-feed-atom": "تلقيم أتوم لهذه الصفحة",
        "tooltip-t-contributions": "رؤية قائمة مساهمات هذا المستخدم",
        "tooltip-t-emailuser": "أرسل رسالة لهذا المستخدم",
+       "tooltip-t-upload": "صبّ فيشيايات",
        "tooltip-ca-nstab-user": "اعرض صفحة المستخدم",
-       "tooltip-ca-nstab-special": "Ù\87Ø°Ù\87 ØµÙ\81حة Ø®Ø§ØµØ©Ø\8c Ù\84ا ØªØ³ØªØ·Ù\8aع Ø£Ù\86 ØªØ¹Ø¯Ù\84 Ø§Ù\84صÙ\81حة Ù\86Ù\81سÙ\87ا",
+       "tooltip-ca-nstab-special": "Ù\87Ø°Ù\8a Ù¾Ø§Ø¬ Ø³Ù¾Ø§Ø³Ù\8aاÙ\84Ø\8c Ù\88 Ù\85ا ØªÙ\86جÙ\91Ù\85Ø´ ØªØ¨Ø¯Ù\91Ù\84 Ù\81Ù\8aÙ\87ا Ø´Ù\8a",
        "tooltip-ca-nstab-project": "رؤية صفحة المحتوى",
        "tooltip-ca-nstab-image": "رؤية صفحة الملف",
        "tooltip-ca-nstab-template": "رؤية القالب",
        "tooltip-watch": "أضف هذه الصفحة إلى قائمة مراقبتك",
        "tooltip-undo": "\"رجوع\" تسترجع هذا التعديل وتفتح نافذة التعديل في نمط العرض المسبق. تسمح بإضافة سبب في الملخص.\n\"Annuler\" trajjeε eltabdila lekhra w tħel fenêtre mtaε  el tabdil mtaε elvue el msabqa. Tnajjem tqoul εlech f'ettalkhis.",
        "tooltip-summary": "أدخل ملخصا قصيرا",
-       "previousdiff": "â\86\92 Ø§Ù\84تعدÙ\8aÙ\84 Ø§Ù\84سابÙ\82",
-       "nextdiff": "اÙ\84تعدÙ\8aÙ\84 Ø§Ù\84Ù\84احÙ\82 ←",
+       "previousdiff": "â\86\92 Ø§Ù\84تبدÙ\8aÙ\84 Ø§Ù\84Ù\81اÙ\8aت",
+       "nextdiff": "اÙ\84تبدÙ\8aÙ\84 Ø§Ù\84جاÙ\8a ←",
        "file-info-size": "$1 × $2 بكسل حجم الملف: $3، نوع MIME: $4",
        "file-nohires": "لا توجد دقة أعلى متوفرة.",
        "svg-long-desc": "ملف SVG، أبعاده $1 × $2 بكسل، حجم الملف: $3",
+       "show-big-image": "الفيشياي الأصلي",
        "metadata": "بيانات ميتا",
        "metadata-help": "هذا الملف يحتوي على معلومات إضافية، غالبا ما تكون أضيفت من قبل الكاميرا الرقمية أو الماسح الضوئي المستخدم في إنشاء الملف.\nإذا كان الملف قد عدل عن حالته الأصلية، فبعض التفاصيل قد لا تعبر عن الملف المعدل.",
        "metadata-fields": "حقول معطيات الميتا الموجودة في هذه الرسالة سوف تعرض في صفحة الصورة عندما يكون جدول معطيات الميتا مضغوطا.\nالحقول الأخرى ستكون مخفية افتراضيا.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-datetime": "نهار و وقت تبديل الفيشياي",
        "namespacesall": "الكل",
        "monthsall": "الكل",
        "watchlisttools-view": "اعرض التغييرات المرتبطة",
        "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
        "watchlisttools-raw": "عدل قائمة المراقبة الخام",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|حديث]])",
        "duplicate-defaultsort": "'''تحذير:''' مفتاح الترتيب الافتراضي \"$2\" يتجاوز مفتاح الترتيب الافتراضي السابق \"$1\".",
        "external_image_whitelist": " #<pre>اترك هذا السطر تماما كما هو\n#ضع منثورات التعبيرات المنتظمة (فقط الجزء الذي يذهب بين //) بالأسفل\n#هذه ستتم مطابقتها مع مسارات الصور الخرجية (الموصولة بشكل مباشر)\n#هذه التي تطابق سيتم عرضها كصور، غير ذلك فقط وصلة إلى الصورة سيتم عرضها\n#السطور التي تبدأ ب# تتم معاملتها كتعليقات\n#هذا لا يتأثر بحالة الحروف\n\n#ضع كل منثورات التعبيرات المنتظمة فوق هذا السطر. اترك هذا السطر تماما كما هو</pre>",
-       "tag-filter": "مرشح [[Special:Tags|الوسوم]]:"
+       "tag-filter": "مرشح [[Special:Tags|الوسوم]]:",
+       "logentry-newusers-create": "إتحلّ حساب {{GENDER:$2|المستعمل|المستعملة}} $1",
+       "searchsuggest-search": "لوّج في {{SITENAME}}"
 }
index e7415f5..894e452 100644 (file)
@@ -16,7 +16,8 @@
                        "Macofe",
                        "WhatamIdoing",
                        "Hogweard",
-                       "Amire80"
+                       "Amire80",
+                       "Pyscowicz"
                ]
        },
        "tog-underline": "Mearc under hlencan:",
        "morenotlisted": "Þis getæl meaht bēon unfulfyled.",
        "mypage": "Mīn tramet",
        "mytalk": "Mīn mōtung",
-       "anontalk": "Þisses IP naman mōtung",
+       "anontalk": "Mōtung",
        "navigation": "Þurhfōr",
        "and": "&#32;and",
        "qbfind": "Findan",
        "searcharticle": "Gān",
        "history": "Trametes stǣr",
        "history_short": "Stǣr",
+       "history_small": "stǣr",
        "updatedmarker": "nīwod æfter mīnre lætestan sōcne",
        "printableversion": "Ūtmǣlendlicu fadung",
        "permalink": "Fæst hlenca",
        "nstab-template": "Bysen",
        "nstab-help": "Helpes tramet",
        "nstab-category": "Flocc",
+       "mainpage-nstab": "Hēafodtramet",
        "nosuchaction": "Swilc dǣd ne biþ nā",
        "nosuchactiontext": "Sēo þe se nettfrumfinded wile dōn nis genge.\nÞū wēninga miswrite þone nettfrumfindend, oþþe folgode unrihtne hlencan.\nÞis mæg ēac tācnian wōh on þǣre weorcwrithyrste þe is gebrocen fram {{SITENAME}}.",
        "nosuchspecialpage": "Swilc syndrig tramet ne biþ nā",
        "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.",
        "oldpassword": "Eald þafungword:",
        "newpassword": "Nīwe þafungword:",
        "retypenew": "Wrīt nīwe þafungword eft:",
+       "botpasswords-label-create": "Scieppan",
+       "botpasswords-label-update": "Nīƿa",
        "resetpass-submit-loggedin": "Andwendan þafungword",
        "resetpass-submit-cancel": "Undōn",
        "passwordreset": "Settan þafungword eft",
        "searchprofile-everything-tooltip": "Sēcan geond ealla innunga (ēac mōtungum)",
        "searchprofile-advanced-tooltip": "Sēcan on mā namsteda",
        "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 worda}})",
-       "search-redirect": "(edlǣded fram \"$1\")",
+       "search-redirect": "(edlǣded fram $1)",
        "search-section": "(dǣl $1)",
        "search-suggest": "Mǣnst þū: $1",
        "search-interwiki-caption": "Sweostorweorc",
        "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.",
        "contributions": "{{GENDER:$1|Brūcendes}} forðunga",
        "contributions-title": "Brūcendes forðunga for $1",
        "mycontris": "Mīna forðunga",
+       "anoncontribs": "forðunga",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
        "uctop": "(genge)",
        "month": "Fram mōnþe (and ǣr)",
        "logentry-move-move": "$1 {{GENDER:$2|wæg}} þone tramet $3 tō $4",
        "logentry-newusers-create": "Brūcendes grīma $1 wæs {{GENDER:$2|geworht}}",
        "revdelete-summary": "ādihtscortnes",
-       "searchsuggest-search": "Sēcan",
+       "searchsuggest-search": "Sēcan {{SITENAME}}",
        "special-characters-group-latin": "Lǣden",
        "special-characters-group-latinextended": "Ēacnod Lǣden",
        "special-characters-group-symbols": "Tācnu",
index ff07205..03fabf7 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": "رابط دائم",
        "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'''.",
        "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من فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
        "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": "اللغة:",
        "editusergroup": "تحميل مجموعات المستخدم",
        "editinguser": "تغيير صلاحيات {{GENDER:$1|المستخدم|المستخدمة}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "عرض صلاحيات المستخدم {{GENDER:$1|للمستخدم|للمستخدمة}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "تعديل مجموعات المستخدم",
-       "userrights-viewusergroup": "عرض مجموعات المستخدم",
+       "userrights-editusergroup": "تعديل مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
+       "userrights-viewusergroup": "عرض مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
        "saveusergroups": "احفظ مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
        "userrights-groupsmember": "عضو في:",
        "userrights-groupsmember-auto": "عضو ضمني في:",
-       "userrights-groups-help": "يمكنك تغيير المجموعات التي ينتمي هذا المستخدم إليها:\n* يعني الصندوق المعلم أن المستخدم في هذه المجموعة.\n* يعني الصندوق غير المعلم أن المستخدم ليس في هذه المجموعة.\n* تعني علامة * عدم إمكانية إزالة المجموعة متى ما أضفتها، أو العكس.",
+       "userrights-groups-help": "يمكنك تغيير المجموعات التي ينتمي هذا المستخدم إليها:\n* يعني الصندوق المعلم أن المستخدم في هذه المجموعة.\n* يعني الصندوق غير المعلم أن المستخدم ليس في هذه المجموعة.\n* تعني علامة * عدم إمكانية إزالة المجموعة متى ما أضفتها، أو العكس.\n* تعن علامة # أنه يمكنك فقط تحديد تاريخ الانتهاء لهذه المجموعة؛ لكن لا يمكنك تقديمه بعد تحديده.",
        "userrights-reason": "السبب:",
        "userrights-no-interwiki": "أنت لا تمتلك الصلاحية لتعديل صلاحيات المستخدمين على الويكيات الأخرى.",
        "userrights-nodatabase": "قاعدة البيانات $1 غير موجودة أو ليست محلية.",
        "userrights-changeable-col": "المجموعات التي يمكنك تغييرها",
        "userrights-unchangeable-col": "المجموعات التي لا يمكنك تغييرها",
+       "userrights-expiry-current": "تنتهي $1",
+       "userrights-expiry-none": "غير منتهية",
+       "userrights-expiry": "تنتهي:",
+       "userrights-expiry-existing": "وقت الانتهاء الموجود: $3، $2",
+       "userrights-expiry-othertime": "وقت آخر:",
+       "userrights-expiry-options": "1 يوم:1 day,1 أسبوع:1 week,1 شهر:1 month,3 شهور:3 months,6 شهور:6 months,1 سنة:1 year",
+       "userrights-invalid-expiry": "تاريخ انتهاء المجموعة \"$1\" غير صحيح.",
+       "userrights-expiry-in-past": "تاريخ انتهاء المجموعة \"$1\" هو في الماضي.",
+       "userrights-cannot-shorten-expiry": "أنت لا يمكنك تقديم تاريخ الانتهاء للمجموعة \"$1\". فقط المستخدمون الذين يمتلكون السماح لإضافة وإزالة هذه المجموعة يمكنهم تقديم تواريخ الانتهاء.",
        "userrights-conflict": "تضارب في تغيير صلاحيات المستخدم! الرجاء مراجعة تغييراتك مجدّدا وتأكيدها.",
        "group": "المجموعة:",
        "group-user": "مستخدمون",
        "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-feedbacklink": "تقديم مراجعات لمرشحات (بيتا) الجديدة",
+       "rcfilters-highlightbutton-title": "التعليم على النتائج",
+       "rcfilters-highlightmenu-title": "اختر لونًا",
+       "rcfilters-highlightmenu-help": "اختر لونا للتعليم على هذه الخاصية",
        "rcfilters-filterlist-noresults": "لم يتم العثور على مرشحات",
-       "rcfilters-filtergroup-authorship": "عدل الملكية",
+       "rcfilters-filtergroup-registration": "تسجيل المستخدم",
+       "rcfilters-filter-registered-label": "مسجل",
+       "rcfilters-filter-registered-description": "المحررون مسجلو الدخول.",
+       "rcfilters-filter-unregistered-label": "غير مسجل",
+       "rcfilters-filter-unregistered-description": "المحررون غير مسجلي الدخول.",
+       "rcfilters-filtergroup-authorship": "ملكية التعديلات",
        "rcfilters-filter-editsbyself-label": "تعديلاتك الشخصية",
        "rcfilters-filter-editsbyself-description": "التعديلات بواسطتك.",
        "rcfilters-filter-editsbyother-label": "التعديلات بواسطة الآخرين",
-       "rcfilters-filter-editsbyother-description": "التعديلات المنشأة بواسطة المستخدمين الآخرين (ليس أنت.)",
+       "rcfilters-filter-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 التعديلات الطفيفة",
        "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-params-json": "معاملات JSON:",
+       "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\"",
        "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}}:اسم المستخدم للمستخدم):",
        "emailccsubject": "نسخة من رسالتك إلى $1: $2",
        "emailsent": "أُرسل البريد الإلكتروني",
        "emailsenttext": "أُرسلت رسالتك الإلكترونية.",
-       "emailuserfooter": "هذا البريد الإلكتروني {{GENDER:$1|تم إرساله}} بواسطة $1 إلى {{GENDER:$2|$2}} بواسطة وظيفة \"{{int:emailuser}}\" في {{SITENAME}}. عنوان البريد الخاص {{GENDER:$2|بك}} سيتم إرساله مباشرة {{GENDER:$1|للمرسل الأصلي|للمرسلة الأصلية}}، مما يكشف عنوان البريد الإلكتروني الخاص {{GENDER:$2|بك}} {{GENDER:$1|لهم}}.",
+       "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 نسخة}}. انظر",
        "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من فضلك اضغط على مفتاح \"رجوع\" لتحميل الصفحة التي جئت منها، ثم حاول مرة أخرى.",
        "sorbs": "دي إن إس بي إل",
        "sorbsreason": "عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}.",
        "sorbs_create_account_reason": "عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}.\nلا يمكنك إنشاء حساب.",
+       "softblockrangesreason": "المساهمات بدون تسجيل الدخول غير مسموح بها من عنوان الأيبي الخاص بك ($1). من فضلك سجل الدخول.",
        "xffblockreason": "عنوان آي‌بي مذكور في ترويسة X-Forwarded-For، الذي ربما يخصّك أو يخصّ خادوما وسيطا تستخدمه، قد حُظِر. السبب الأصلي للحظر كان: $1",
        "cant-see-hidden-user": "المستخدم الذي تحاول منعه تم منعه سابقاً وإخفاؤه. بما أنك لا تمتلك صلاحية إخفاء المستخدم، لا يمكنك مشاهدة المنع أو تعديله.",
        "ipbblocked": "لا يمكنك منع أو رفع منع مستخدمين آخرين لأنك ممنوع",
        "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-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.",
        "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": "جلسات قائمة على ملفات تعريف الارتباط (كوكيز)",
        "usercssispublic": "من فضل لاحظ: صفحات الCSS الفرعية لا ينبغي أن تحتوي على بيانات سرية بما أنها يمكن رؤيتها بواسطة المستخدمين الآخرين.",
        "restrictionsfield-badip": "عنوان أيبي أو نطاق غير صحيح: $1",
        "restrictionsfield-label": "نطاقات الأيبي المسموح بها:",
-       "restrictionsfield-help": "عنوان أيبي أو نطاق CIDR واحد لكل سطر. لتفعيل كل شيء، استخدم<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "عنوان أيبي أو نطاق CIDR واحد لكل سطر. لتفعيل كل شيء، استخدم:\n<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "المراجعة $1",
        "pageid": "معرف الصفحة $1"
 }
index dd96161..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 50a5601..0120e9b 100644 (file)
        "saveprefs": "حفظ",
        "restoreprefs": "استرجع التظبيطات الاصليه",
        "prefs-editing": "تعديل",
-       "rows": "صفوف:",
-       "columns": "عمدان:",
        "searchresultshead": "تدوير",
        "stub-threshold": "الحد لتنسيق <a href=\"#\" class=\"stub\">لينك البذرة</a>:",
        "stub-threshold-disabled": "معطل",
index 3c3f9ac..deff232 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",
        "selfredirect": "<strong>Atención:</strong> Tas redirixendo esta páxina a ella mesma.\nSeique conseñaras un oxetivu enquivocáu pa la redireición, o que teas editando una páxina enquivocada. Si vuelves a facer clic en «{{int:savearticle}}», crearáse la redireición de toles maneres.",
        "missingcommenttext": "Por favor, escribi un comentariu abaxo.",
        "missingcommentheader": "<strong>Recordatoriu:</strong> Nun conseñasti un asuntu pa esti comentariu.\nSi calques nuevamente «{{int:savearticle}}», la to edición guardaráse ensin nengunu.",
-       "summary-preview": "Vista previa del resume:",
+       "summary-preview": "Vista previa del resume d'edición:",
        "subject-preview": "Vista previa del asuntu:",
        "previewerrortext": "Hebo un error al intentar entever los cambios.",
        "blockedtitle": "L'usuariu ta bloquiáu",
        "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",
        "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",
        "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:",
        "editusergroup": "Cargar los grupos d'usuariu",
        "editinguser": "Camudando los permisos {{GENDER:$1|del usuariu|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Viendo los permisos {{GENDER:$1|del usuariu|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Editar los grupos d'usuariu",
-       "userrights-viewusergroup": "Ver los grupos d'usuariu",
+       "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-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.",
        "group": "Grupu:",
        "group-user": "Usuarios",
        "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-feedbacklink": "Comentar sobro los nuevos filtros (beta)",
+       "rcfilters-highlightbutton-title": "Resaltar resultaos",
+       "rcfilters-highlightmenu-title": "Seleiciona un color",
+       "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-params-json": "Parámetros JSON:",
+       "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».",
        "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}}. Unviaráse'l {{GENDER:$2|to}} corréu direutamente {{GENDER:$1|al remitente|a la remitente}} orixinal, {{GENDER:$1|revelando-y}} la {{GENDER:$2|to}} direición de corréu.",
+       "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",
        "editcomment": "El resume de la edición yera: <em>$1</em>.",
        "revertpage": "Revertíes les ediciones de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]]) hasta la cabera versión de [[User:$1|$1]]",
        "revertpage-nouser": "Revertíes les ediciones de (usuariu desaniciáu) a la cabera revisión de {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Revertíes les ediciones de $1; camudáu a la última versión de $2.",
+       "rollback-success": "Revertíes les ediciones de {{GENDER:$3|$1}}; devueltu a la última revisión de {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertíes les ediciones de $1 a la última revisión de $2. [$3 Ver cambeos]",
        "sessionfailure-title": "Fallu de sesión",
        "sessionfailure": "Paez qu'hai un problema cola to sesión; por precaución\ncancelóse l'aición que pidisti. Da-y al botón \"Atrás\" del\nnavegador pa cargar otra vuelta la páxina y vuelve a intentalo.",
        "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",
        "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": "Yá 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'l 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-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-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",
        "usercssispublic": "Atención: les subpáxines CSS nun tendríen de contener datos acutaos porque son visibles pa otros usuarios.",
        "restrictionsfield-badip": "Direición o rangu IP inválidu: $1",
        "restrictionsfield-label": "Rangos d'IP permitíos:",
-       "restrictionsfield-help": "Una única direición IP o rangu CIDR per llinia. P'activar toos, utiliza<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "Una única direición IP o rangu CIDR per llinia. P'activar toos, utiliza:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisión $1",
        "pageid": "ID de páxina $1"
 }
index e2ea9aa..c335429 100644 (file)
@@ -12,7 +12,7 @@
                        "Аль-Гимравий"
                ]
        },
-       "tog-underline": "Ð\9bинкал Ð³Ñ\8aоÑ\80кÑ\8cмÑ\83Ñ\85Ñ\8aизе",
+       "tog-underline": "РегÐ\86елазда Ð³Ñ\8aоÑ\80кÑ\8c Ð¼Ñ\83Ñ\85Ñ\8a Ð»Ñ\8aезе:",
        "tog-hideminor": "ЧӀахӀиял хиса-басиязул сияхӀалда дагьа-макъал хиса-басиял рахчизе",
        "tog-showtoolbar": "Хиса-басиял гьарулеб мехалда тӀасияб алатазул панель бихьизабизе",
        "tog-editondblclick": "КӀиго кӀутӀиялдалъун гьумералъул хиса-баси гьабизе",
        "moredotdotdot": "Жеги...",
        "morenotlisted": "Гьаб сияхӀ цӀураб гьечӀо",
        "mypage": "Гьумер",
-       "mytalk": "БахӀс",
+       "mytalk": "Гьоркьоб лъей",
+       "anontalk": "Гьоркьоб лъей",
        "navigation": "Навигация",
        "and": "&#32;ва",
        "qbfind": "ЦӀехезе",
        "qbbrowse": "Балагьизе",
        "qbedit": "Хисизабизе",
-       "qbpageoptions": "Гьемералъул рекъезаби",
+       "qbpageoptions": "Гьумералъул рекъезаби",
        "qbmyoptions": "Дур рекъезаби",
        "faq": "FAQ",
        "namespaces": "ЦӀаразул сияхӀ",
        "searchbutton": "Хъирщизе",
        "go": "Ине",
        "searcharticle": "Ине",
-       "history": "ХиÑ\81а-баÑ\81азул тарих",
+       "history": "ХиÑ\81а-баÑ\81иÑ\8fзул тарих",
        "history_short": "Тарих",
        "printableversion": "Басмалъул версия",
-       "permalink": "Даимаб линк",
+       "permalink": "Даимаб регІел",
        "print": "Басмаялда бахъизе",
        "view": "Балагьи",
        "view-foreign": "$1 сайталда балагьизе",
        "unprotectthispage": "Гьаб гьумералъул цӀуни хисизабизе",
        "newpage": "ЦIияб гьумер",
        "talkpage": "БахӀс",
-       "talkpagelinktext": "Ð\91аÑ\85\81",
+       "talkpagelinktext": "Ð\93Ñ\8cоÑ\80кÑ\8cоб Ð»Ñ\8aей",
        "specialpage": "Хъулухъияб гьумер",
        "personaltools": "Дур алатал",
-       "articlepage": "Ð\91алагÑ\8cизе Ð¼Ð°ÐºÑ\8aалаÑ\8fлда",
-       "talk": "Ð\91аÑ\85Ð\86Ñ\81",
+       "articlepage": "Ð\9cакÑ\8aалаÑ\8fлде Ð±Ð°Ð»Ð°Ð³Ñ\8cизе",
+       "talk": "Ð\93Ñ\8cоÑ\80кÑ\8cоб Ð»Ñ\8aей",
        "views": "Балагьиял",
        "toolbox": "Алатал",
-       "userpage": "ГӀахьалчиясул гьумер",
+       "userpage": "ГӀахьалчиясул гьумералъухъ балагьизе",
        "projectpage": "Проекталъул гьумералъухъ балагьизе",
        "imagepage": "Файлалъул гьумер балагьизе",
        "mediawikipage": "Кагъаталъул гьумер балагьизе",
        "otherlanguages": "Цоги мацӀазда",
-       "redirectedfrom": "(«$1» гьемералдасан гьаниб битӀана)",
+       "redirectedfrom": "(«$1» гьумералдасан гьаниб битӀана)",
        "redirectpagesub": "Цоги гьумералда сверизабураб гьумер",
        "redirectto": "Редирект:",
        "lastmodifiedat": "Ахирисеб нухалъ гьаб гьумералъул хиса-баси гьабуна:  $2, $1.",
        "jumptonavigation": "навигация",
        "jumptosearch": "хъирщизе",
        "pool-errorunknown": "Лъалареб гъалатӀ",
-       "aboutsite": "{{SITENAME}} хӀакъалъулъ",
+       "aboutsite": "{{GRAMMAR:prepositional|{{SITENAME}}}} хІакъалъулъ",
        "aboutpage": "Project:ХӀакъалъулъ",
        "currentevents": "Жакъасел лъугьа-бахъинал",
        "currentevents-url": "Project:Гьанжесел лъугьа-бахъинал",
        "disclaimerpage": "Project:Жавабчилъиялдасан инкар гьаби",
        "edithelp": "Хисизабиялъе кумек",
        "helppage-top-gethelp": "Кумек",
-       "mainpage": "БетӀераб гьумер",
-       "mainpage-description": "БетӀераб гьумер",
+       "mainpage": "БетІераб гьумер",
+       "mainpage-description": "БетІераб гьумер",
        "policy-url": "Project:КъагӀидаби",
        "portal": "ЖамгӀияб портал",
        "portal-url": "Project:Майдан",
        "createacct-reason-ph": "Щай дуца цогияб аккаунт гIуцIулеб бугеб",
        "createacct-submit": "Аккаунт гIуцIизе",
        "createacct-another-submit": "Цоги аккаунт гIуцIизе",
-       "createacct-benefit-heading": "{{SITENAME}} гӀуцӀун буго нужго гӀадинал гӀадамаца.",
+       "createacct-benefit-heading": "{{SITENAME}} — ккола нужго гӀадинал гӀадамазулги нужерги гІахьалаб хІалтІи.",
        "createacct-benefit-body1": "{{PLURAL:$1|хиса-баси}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|гьумер}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|гьумер|гьумерал}}",
        "createacct-benefit-body3": "Ахирисеб заманаялда жаниб {{PLURAL:$1|гIахьалчи}}",
        "badretype": "Дуца рихьизарурал паролал данде кколел гьечIо",
        "userexists": "Бихьизабураб гIахьалчиясул цIар цогияс хIалтIизабулеб буго.\nБегьулеб батани, дуего батIияб цIар бище.",
        "pt-createaccount": "Аккаунт рагьизе",
        "pt-userlogout": "КъватӀиве инзе",
        "passwordreset": "Парол хисизе",
+       "passwordreset-username": "ГІахьалчиясул цІар:",
        "resettokens-tokens": "Токенал:",
        "italic_sample": "Курсивалъулаб хъвай",
        "italic_tip": "Курсивалъулаб хъвай",
        "link_sample": "Линкалъул бетӀер",
-       "link_tip": "Ð\96аниÑ\81аб Ð»Ð¸Ð½Ðº",
+       "link_tip": "Ð\96аниÑ\81еб Ñ\80егÐ\86ел",
        "headline_sample": "БетIералъул текст",
        "headline_tip": "2-еб даражаялъул бетIер",
-       "media_tip": "Файлалъе линк",
+       "media_tip": "Файлалде регІел",
        "sig_tip": "Дур гъулбас ва гьабсагӀаталъ заман",
        "summary": "Дуца гьарурал хиса-басиял:",
        "subject": "Тема/бетӀер",
        "showdiff": "Гьарурал хиса-басиял",
        "loginreqlink": "Жаниве лъугьине",
        "newarticle": "(ЦIияб)",
+       "newarticletext": "РегІелаздасан нуж лъугьана жеги гІуцІун гьечІеб гьумералде.\nГьеб гІуцІизе бокьани, гъоркьехун текст хъвай (цІикІкІун лъазе бл. [$1 баяналъулаб гьумералде]).\nНуж гьанире гъалатІ ккун щварал ратани, гІицІго '''нахъе''' абураб кнопка мерхье дурго браузералъул.",
        "updated": "(ЦӀигьабуна)",
        "note": "<strong>ХӀужа:</strong>",
        "previewnote": "<strong>КӀочоге, мун гьабсагӀаталъ балагьула вуго макъалаялъул букӀине бугеб куцалъухъ.</strong>\nДуца гьарурал хиса-басиял цӀунун гьечӀо!",
        "lineno": "Мухъ $1:",
        "editundo": "нахъчӀвазе",
        "diff-empty": "(БатӀалъи гьечӀо)",
-       "searchresults": "ЦӀех-рехалъул хӀасилал",
+       "searchresults": "ЦІех-рехалъул хІасилал",
        "prevn": "{{PLURAL:$1|1=цебесалаб|цересел}} $1",
        "nextn": "{{PLURAL:$1|1=хадусалаб|хадусел}} $1",
        "prev-page": "Цебесеб гьумер",
        "searchprofile-everything-tooltip": "Киналго гьумеразда хъирщизе (бахӀсазул гьумераздагицин)",
        "search-result-size": "$1 ({{PLURAL:$2|$2 рагӀи|$2 рагӀи|$2 рагӀи}})",
        "searchall": "киналго",
+       "search-nonefound": "Дуца гьабураб цІех-рехалда данде кколеб щибго батичІо.",
+       "powersearch-ns": "ЦІарал рищун хъирщи:",
+       "powersearch-togglelabel": "ГІуж лъезе:",
        "powersearch-toggleall": "Киналго",
        "powersearch-togglenone": "Щибниги",
+       "powersearch-remember": "Дуца тІаса бищараб рекъезаби цІунизе хадубккун букІине бугеб хъирщиялъе",
        "search-external": "КъватIисеб цIехей",
        "preferences": "Рекъезаби",
        "mypreferences": "Рекъезаби",
        "action-upload": "гьаб файл жанибе цIазе",
        "enhancedrc-history": "тарих",
        "recentchanges": "ЦӀиял хиса-басиял",
+       "recentchanges-legend": "ЦІиял хиса-басиязул рекъезариял",
        "recentchanges-label-newpage": "Гьаб хиса-басигун цӀияб гьумер рагьана.",
        "recentchanges-label-minor": "Гьаб буго дагьа-макъаб хиса-баси",
        "recentchanges-label-bot": "Гьаб хиса-баси ботас гьабуна",
+       "recentchanges-label-unpatrolled": "Гьаб хиса-басиялъул жеги лъицаниги хал гьабичІо",
+       "recentchanges-label-plusminus": "байт роценалдалъун кIодолъи-гьитIинлъи хисизаби",
+       "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (гьединго балагье [[Special:NewPages|цІиял гьумеразул сияхІалъухъ]])",
        "rcshowhideminor": "$1 гӀиси-микъинал хиса-басиял",
        "rcshowhideminor-show": "Бихьизабизе",
        "rcshowhideminor-hide": "Бахчизе",
        "rcshowhidemine": "$1 дир хиса-басиял",
        "rcshowhidemine-show": "Бихьизабизе",
        "rcshowhidemine-hide": "Бахчизе",
+       "rcshowhidecategorization": "Гьумерал категориязде бикьи $1",
+       "rclinks": "$2 къояйида жаниб гьабураб, ахирисеб $1 хиса-баси бихьизабизе<br />$3",
        "diff": "батӀалъи",
        "hist": "тарих",
        "hide": "Бахчизе",
        "booksources-search": "Хъирщизе",
        "specialloguserlabel": "ГӀахьалчи:",
        "log": "Журналал",
+       "logempty": "Журналалда данде кколел хъвай-хъвагІаял гьечІо.",
        "allarticles": "Киналго макъалаби",
-       "allpagessubmit": "Ð\98нзе",
+       "allpagessubmit": "ТÓ\80Ñ\83базабизе",
        "categories": "Категориял",
-       "watchlist": "Халгьабиялъул сияхӀ",
-       "mywatchlist": "Халгьабиялъул сияхӀ",
+       "watchlist": "Халгьабиялъул сияхІ",
+       "mywatchlist": "Халгьабиялъул сияхІ",
        "watch": "Хал кквезе",
        "namespace": "ЦӀаразул сияхӀ:",
+       "invert": "ТІасабищараб сверизабизе",
        "blanknamespace": "(Аслияб)",
        "contributions": "{{GENDER:$1|ГӀахьалчиясул}} хӀалтӀи",
        "mycontris": "Дур хӀалтӀи",
+       "sp-contributions-newbies": "ГІицІго, цІиял гІахьалчагІаз гьабураб хІалтІи бихьизабизе",
+       "sp-contributions-talk": "гьоркьоб лъей",
        "sp-contributions-userrights": "ГІахьалчиясул ихтиярал",
-       "whatlinkshere": "Гьанире линкал",
+       "sp-contributions-search": "ХІалтІи хъирщизе",
+       "sp-contributions-hideminor": "ГІиси-бикъинал хиса-басиял рахчизе",
+       "whatlinkshere": "Гьанире регІелал",
        "whatlinkshere-title": "«$1» гьумералда бухьен гьабулел гьумерал",
        "whatlinkshere-page": "Гьумер:",
+       "nolinkshere": "'''[[:$1]]''' гьумералде цоги гьумераздасан регІелал гьечІо.",
        "isredirect": "редирект-гьумер",
-       "isimage": "файлалъул линк",
+       "isimage": "файлалъул регІел",
        "whatlinkshere-prev": "{{PLURAL:$1|1=цебесеб|цересел}} $1",
        "whatlinkshere-next": "{{PLURAL:$1|1=хадусеб|хадусел}} $1",
-       "whatlinkshere-links": "← линкал",
+       "whatlinkshere-links": "← регІелал",
        "whatlinkshere-hideredirs": "$1 редиректал",
        "whatlinkshere-hidelinks": "$1 линкал",
        "whatlinkshere-filters": "Фильтрал",
+       "whatlinkshere-submit": "ТӀубазабизе",
        "blockip": "ГІахьалчи блокалда лъезе",
        "ipbsubmit": "Гьав гІахьалчи/адрес блокалда лъезе",
        "ipb-confirmhideuser": "Нужеда ракІалда буго гІахьалчи блокалда лъезе ва гьесул цмар бахчизе. Гьеб загьирлъуларо сияхІазда ва журналазда. Гьеб гьабизе бокьун бугищ нужее?",
        "blocklink": "Блокалда лъезе",
        "contribslink": "хӀалтӀи",
        "move-page-legend": "Гьумералъул цӀар хисизе",
+       "newtitle": "ЦІияб цІар:",
+       "move-watch": "Басрияб ва цІияб цІаразул гьумерал дурго халкквеязул сияхІалде журазе",
        "movepagebtn": "Гьумералъул цӀар хисизе",
-       "movelogpage": "ЦӀарал хисиялъул журнал",
+       "movetalk": "Гьелдаго данде кколеб гьоркьоб лъеялъул гьумералъулги цІар хисизе",
+       "move-subpages": "($1 щвезегІан) гъоркьгьумеразул цІарал хисизе",
+       "movelogpage": "ЦІарал хисиялъул журнал",
+       "movesubpagetext": "Гьаб гьумералъул $1 {{PLURAL:$1|гъоркьгьумер|гъоркьгьумер|гъоркьгьумер}} буго.",
+       "move-leave-redirect": "Цоги рахъалдехун сверизабунин абураб ишара лъезе",
        "thumbnail-more": "КӀодолъизабизе",
        "tooltip-pt-userpage": "Дур гӀахьалчиясул гьумер",
        "tooltip-pt-mytalk": "Дур бахӀсалъул гьумер",
        "tooltip-n-recentchanges": "Ахирисел хиса-басиязул сияхӀ",
        "tooltip-n-randompage": "Цебе ккараб гьумералда балагьизе",
        "tooltip-n-help": "Баянал росизе кӀолеб бакӀ",
-       "tooltip-t-whatlinkshere": "Гьаб гьумералда линк гьабулелщинал гьумеразул сияхӀ",
+       "tooltip-t-whatlinkshere": "Гьаб гьумералда регІелал гьарулелщинал гьумеразул сияхІ",
        "tooltip-t-upload": "Файлал цІазе",
        "tooltip-t-specialpages": "Хъулухъиял гьумеразул сияхӀ",
        "tooltip-t-print": "Гьаб гьумералъул басмаялъул сверел",
        "tooltip-ca-nstab-main": "Аслияб гьумер бихьизабизе",
-       "tooltip-ca-nstab-user": "ГӀахьалчиясул гьумер",
+       "tooltip-ca-nstab-user": "ГІахьалчиясул хасаб гьумер",
        "tooltip-ca-nstab-special": "Гьаб буго хъулухъияб гьумер. Гьаб хисизабизе данде кколаро.",
        "tooltip-ca-nstab-image": "Файлалъул гьумер",
        "tooltip-save": "Дуца гьарурал хиса-басиял цӀунизе",
        "exif-orientation-1": "Нормалияб",
        "namespacesall": "киналго",
        "monthsall": "киналго",
+       "table_pager_limit_submit": "ТӀубазабизе",
        "hijri-calendar-m1": "МухІаррам",
        "hijri-calendar-m3": "РабигІул-Аввал",
        "hijri-calendar-m4": "РабигІу Ссани",
index 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 b48c450..4aa597b 100644 (file)
@@ -28,7 +28,8 @@
                        "Sayginer",
                        "Şeyx Şamil",
                        "Serkanland",
-                       "Macofe"
+                       "Macofe",
+                       "Archaeodontosaurus"
                ]
        },
        "tog-underline": "Keçidlərin altını xətlə:",
        "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ə",
        "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 d06e28e..fa43219 100644 (file)
        "saveprefs": "ذخیره ائت",
        "restoreprefs": "بوتون ایلک ترجیح‌لری قایتار",
        "prefs-editing": "دَییشدیرمک‌ده",
-       "rows": "سطرلر:",
-       "columns": "سوتون‌لار",
        "searchresultshead": "آختار",
        "stub-threshold": "<a href=\"#\" class=\"stub\">باغلانتی‌سیز لینکی</a> دییشدیرمک اوچون حدود (بایت‌لارلا):",
        "stub-threshold-sample-link": "میثال",
        "uploaddisabledtext": "فايل يوکلنمه‌سی باش توتمادی.",
        "php-uploaddisabledtext": "پی اچ پی فایل یوکلملری دؤوره خاریجی‌دیر. خاهیش ائدیریک file_uploads تنظیم لرین یئنی دن بیر باخین.",
        "uploadscripted": "بو فایل بیر اینتئرنئت آختاریش برنامه سی طرفین‌دن سهو چئوریلبیلجک بیر HTML و یا ایسکریپت کودو عبارت‌دیر.",
-       "uploadscriptednamespace": "بۇ SVG فایلیندا بیر یاساق آدفضاسی ($1) واردیر.",
+       "uploadscriptednamespace": "بۇ SVG فایلیندا بیر یاساق آدفضاسی (<nowiki>$1</nowiki>) واردیر.",
        "uploadinvalidxml": "یۆکله‌نیلن فایل‌دا XML تحلیل اولونانمادی.",
        "uploadvirus": "فايلدا ویروس وار!  \nدئتاللار: $1",
        "uploadjava": "فایل، بیر جاوا. نوع ‎‎class ائهتیوا ائدن بیر زیپ فایلی‌دیر.\nجاوا فایل‌لارینین یوکلنمه‌سینه ایجازه وئریلمیر، چونکی تهلوکه‌سیزلیک محدودلاشدیرما‌لارینین آتلانماسینا سبب اولا بیلمکده‌دیرلر.",
        "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": "ایشلدن لیستی",
        "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 ce5b1f9..5470783 100644 (file)
        "about": "Тасуирлау",
        "article": "Мәҡәлә",
        "newwindow": "(яңы биттә)",
-       "cancel": "Ð\91Ó©Ñ\82Ó©Ñ\80Ó©Ñ\80гÓ\99",
+       "cancel": "Ð\9aиÑ\80е Ð°Ð»Ñ\8bÑ\80Ò\93а",
        "moredotdotdot": "Дауамы...",
        "morenotlisted": "Был исемлек тулы түгел",
        "mypage": "Бит",
        "views": "Ҡарауҙар",
        "toolbox": "Ҡоралдар",
        "tool-link-userrights": "{{GENDER:$1|Ҡатнашыусы}} төркөмдәрен үҙгәртергә",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Ҡатнашыусы|Ҡатнашыулар}} төркөмдәрен ҡарарға",
        "tool-link-emailuser": "{{GENDER:$1|Ҡатнашыусыға}} хат яҙырға",
        "userpage": "Ҡулланыусы битен ҡарарға",
        "projectpage": "Проект битен ҡарарға",
        "title-invalid-too-long": "Һоралған бит исеме бик оҙон. $1 {{PLURAL:$1|байттан}} артмаҫҡа тейеш.",
        "title-invalid-leading-colon": "Һораған бит башында ярамаған ике нөктә бар.",
        "perfcached": "Был мәғлүмәттәр кэштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. Кэшта иң күбе {{PLURAL:$1|язма}} һаҡлана.",
-       "perfcachedts": "Был мәғлүмәттәр кэштан алынған, ул һуңғы тапҡыр $1 яңыртылды.  Кэшта иң күбе  {{PLURAL:$4|язма}} һаҡлана",
+       "perfcachedts": "Был мәғлүмәттәр кэштан алынған, ул һуңғы тапҡыр $1 яңыртылды.  Кэшта иң күбе $4 {{PLURAL:$4|яҙма}} һаҡлана.",
        "querypage-no-updates": "Был битте яңыртыу хәҙер тыйылған.\nБында күрһәтелгән мәғлүмәттәр яңыртылмаясаҡ.",
        "viewsource": "Сығанаҡты ҡарау",
        "viewsource-title": "$1 битенең сығанаҡ текстын ҡарарға",
        "createacct-yourpasswordagain-ph": "Серһүҙҙе тағы бер тапҡыр яҙығыҙ",
        "userlogin-remembermypassword": "Системала ҡалырға",
        "userlogin-signwithsecure": "Һаҡланыулы тоташыу",
+       "cannotlogin-title": "инеп булмай",
+       "cannotlogin-text": "Инеү мөмкин түгел",
        "cannotloginnow-title": "Хәҙер үк инеп булмай",
        "cannotloginnow-text": "$1 файҙалланған ваҡытта инергә ярамай",
+       "cannotcreateaccount-title": "Иҫәп яҙмаһын булдырып булмай",
+       "cannotcreateaccount-text": "Был викила иҫәп яҙмаһын булдырыу ҡаралмаған.",
        "yourdomainname": "Һеҙҙең домен",
        "password-change-forbidden": "Был викиҙа серһүҙегеҙҙе үҙгәртә алмайһығыҙ.",
        "externaldberror": "Тышҡы мәғлүмәт базаһы менән танылғанда хата барлыҡҡа килде йәки тышҡы үҙ көйләүҙәрегеҙҙе үҙгәртер өсөн хоҡуҡтарығыҙ етәрле түгел.",
        "eauthentsent": "Күрһәтелгән электрон почта адресына адресты үҙгәртеүҙе раҫлауығыҙ өсөн хат ебәрелде. Хатта был адрес һеҙҙеке булғанын раҫлау өсөн ниндәй ғәмәлдәрҙе үтәү кәрәклеге тураһында мәғлүмәт бар.",
        "throttled-mailpassword": "Серһүҙҙе иҫләтеү ғәмәле {{PLURAL:$1|һуңғы $1 сәғәт}} эсенде ҡулланылды инде.\nНасар ниәтле ҡулланыуҙарға ҡаршы, Серһүҙ иҫләтеү ғәмәлен {{PLURAL:$1|1=сәғәт|$1 сәғәт}} эсендә бер тапҡыр ғына ҡулланырға була.",
        "mailerror": "Хат ебәреү хатаһы: $1",
-       "acct_creation_throttle_hit": "Һеҙҙең IP-адрестан бер тәүлек эсендә {{PLURAL:$1|$1 иҫәп яҙыуы}} яһалды инде, был һан был ваҡыт аралығы өсөн максимум һан. Шул сәбәпле, был IP-адресына эйә ҡулланыусылар, хәҙерге ваҡытта яңы иҫәп яҙыуы яһай алмайҙар.",
+       "acct_creation_throttle_hit": "Һеҙҙең IP-адрестан бер тәүлек эсендә {{PLURAL:$1|$1 иҫәп яҙыуы}} яһалды инде, был һан был ваҡыт аралығы өсөн максимум һан. Шул сәбәпле, был IP-адресына эйә ҡулланыусылар, хәҙерге ваҡытта яңы иҫәп яҙыуы яһай алмайҙар. Был ваҡыт эсендә $2 тапҡыр инеп була.",
        "emailauthenticated": "Электрон почта адресығыҙ раҫланды: $3, $2.",
        "emailnotauthenticated": "Электрон почта адресығыҙ раҫланмаған әле. Киләһе ғәмәлдәр өсөн электрон почта эшләмәйәсәк.",
        "noemailprefs": "Электрон почта адресығыҙ күрһәтелмәгән, шул сәбәпле викиның электрон почта функциялары ябыҡ.",
        "resetpass_submit": "Серһүҙ ҡуйырға һәм танышырға",
        "changepassword-success": "Серһүҙегеҙ уңышлы үҙгәртелде!",
        "changepassword-throttled": "Һеҙ системаға ҡат-ҡат танылырға тырыштығыҙ.\nТағы бер танылырҙан алда, зинһар, $1 көтөгөҙ.",
-       "botpasswords": "Роботтар серһүҙе.",
+       "botpasswords": "Роботтар серһүҙе",
        "botpasswords-summary": "<em>ПРобот пароле</em> API иҫәп яҙмаһына логин һәм паролһыҙ инергә мөмкинлек бирә. Робот пароле менән ингәндә ҡулланыусы хоҡуғы сикләнгән булыуы мөмкин.\n\nНи өсөн икәнен белмәһәгеҙ, быны эшләмәүегеҙ яҡшыраҡ.",
        "botpasswords-disabled": "Роботтар серһүҙе һүндерелгән.",
        "botpasswords-no-central-id": "Робот серһүҙен ҡулланыу өсөн үҙәк иҫәп яҙмаһына инергә кәрәк.",
        "botpasswords-updated-body": "$1 роботы өсөн $2 ҡулланыусыһы серһүҙе яңыртылды.",
        "botpasswords-deleted-title": "Робот серһүҙе юйылды.",
        "botpasswords-deleted-body": "$1 роботы өсөн $2 ҡулланыусыһы серһүҙе юйылды.",
-       "botpasswords-newpassword": "Инеү өсөн яңы серһүҙ <strong>$1</strong> — <strong>$2</strong>. <em>Артабан ҡулланыу өсөн яһып алығыҙ.</em>",
+       "botpasswords-newpassword": "Инеү өсөн яңы серһүҙ <strong>$1</strong> — <strong>$2</strong>. <em>Артабан ҡулланыу өсөн яһып алығыҙ.</em><strong>$3</strong> ҡатнашыусы исеме <strong>$4</strong> пароль сифаты)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider ғәмәлдә түгел.",
        "botpasswords-restriction-failed": "Робот серһүҙе менән бәйле сәбәптәр булғанға инеү башҡарылманы.",
        "botpasswords-invalid-name": "Күрһәтелгән ҡулланыусы исемендә робот $1 серһүҙен бүлеүсе тамға юҡ.",
        "resetpass_forbidden-reason": "Серһүҙҙәр үҙгәртелә алмай: $1",
        "resetpass-no-info": "Был битте туранан ҡарау өсөн һеҙгә системала танылырға кәрәк.",
        "resetpass-submit-loggedin": "Серһүҙҙе үҙгәртергә",
-       "resetpass-submit-cancel": "Ð\91Ó©Ñ\82Ó©Ñ\80Ó©Ñ\80гÓ\99",
+       "resetpass-submit-cancel": "Ð\9aиÑ\80е Ð°Ð»Ñ\8bÑ\80Ò\93а",
        "resetpass-wrong-oldpass": "Хаталы ваҡытлыса йәки ағымдағы серһүҙ.\nҺеҙ, бәлки, серһүҙегеҙҙе алмаштырғанһығыҙ йәки яңы серһүҙ һоратҡанһығыҙ.",
        "resetpass-recycled": "Үҙегеҙҙекенән айырмалы серһүҙ һайлағыҙ.",
        "resetpass-temp-emailed": "Һеҙ электорон почта аша ебәрелгән ваҡытлыса серһүҙ менән индегеҙ. Инеүҙе башҡарыу өсөн яңы серһүҙ яҙығыҙ.",
        "saveprefs": "Һаҡларға",
        "restoreprefs": "Алдан ҡуйылған көйләүҙәрҙе тергеҙергә",
        "prefs-editing": "Мөхәррирләү",
-       "rows": "Юлдар:",
-       "columns": "Бағаналар:",
        "searchresultshead": "Эҙләү",
        "stub-threshold": "Яһалма һылтамаларҙың биҙәлеше буйынса сикләүҙәр ($1):",
        "stub-threshold-sample-link": "миҫал",
        "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-файлдарын тейәү тыйылған.",
        "feedback-useragent": "Браузер:",
        "searchsuggest-search": "{{SITENAME}} эсендә эҙләү",
        "searchsuggest-containing": "эстәлегендә...",
-       "api-error-badaccess-groups": "Һеҙгә был викиға файлдар күсереү рөхсәт ителмәй",
        "api-error-badtoken": "Эске хата: дөрөҫ булмаған токен",
-       "api-error-blocked": "Мөхәррирләү һеҙҙең өсөн бикләнде.",
-       "api-error-copyuploaddisabled": "Был серверҙа URL адрес буйынса йөкләү өҙөлгән",
-       "api-error-duplicate": "Бындай эстәлекле {{PLURAL:$1|файл}}  бар.",
-       "api-error-duplicate-archive": "Сайтта бындай эстәлекле {{PLURAL:$1|башҡа файл}} бар ине инде, ләкин {{PLURAL:$1|1=ул юйылды|улар юйылды}}",
-       "api-error-empty-file": "Һеҙ ебәргән файл буш.",
        "api-error-emptypage": "Яңы буш биттәр яһау тыйыла.",
-       "api-error-fetchfileerror": "Эске хата: файлды күсергән ваҡытта хата китте",
-       "api-error-fileexists-forbidden": "«$1» исемле файл бар һәм өҫтөнә яҙып булмай.",
-       "api-error-fileexists-shared-forbidden": "«$1» исемле файл уртаҡ файлдар һаҡлағысында бар һәм өҫтөнә яҙып булмай.",
-       "api-error-file-too-large": "Һеҙ ебәргән файл үтә ҙур.",
-       "api-error-filename-tooshort": "Файл исеме бик ҡыҫҡа.",
-       "api-error-filetype-banned": "Был файл төрө тыйылған.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|1=тыйылған файл төрө|тыйылған файл төрҙәре}}. Рөхсәт ителгән {{PLURAL:$3|1=файл төрө|файл төрҙәре}} $2.",
-       "api-error-filetype-missing": "Был файлдың ҡушымтаһы юҡ",
-       "api-error-hookaborted": "Һеҙ эшләргә теләгән үҙгәртеүҙәр ҡушымтаны тикшереүсе тарафынан өҙөлдө",
-       "api-error-http": "Эске хата: серверға бәйләнеп булмай.",
-       "api-error-illegal-filename": "Рөхсәт ителмәгән файл исеме.",
-       "api-error-internal-error": "Эске хата: һеҙ викиға йөкләгәнде тикшергән ваҡытта хата китте",
-       "api-error-invalid-file-key": "Эске хата: ваҡытлыса һаҡлағыста файл табылманы",
-       "api-error-missingparam": "Эске хата: мөрәжәғеттең параматрҙары юҡ.",
-       "api-error-missingresult": "Эске хата: күсереү уңышлы булыуын билдәләп булманы.",
-       "api-error-mustbeloggedin": "Файлдарҙы йөкмәтеү өсөн һеҙ сисемаға танышырға тейешһегеҙ.",
-       "api-error-mustbeposted": "Эске хата: мөрәжәғәт HTTP POST адресын талап итә.",
-       "api-error-noimageinfo": "Йөкләү уңышлы тамамланды, әммә сервер файл тураһында бер ниндәйҙә мәғлүмәт бирмәне.",
-       "api-error-nomodule": "Эске хата: тейәү модуле көйләнмәгән.",
-       "api-error-ok-but-empty": "Эске хата: серверҙан яуап юҡ.",
-       "api-error-overwrite": "Булған файлды алыштырыу рөхсәт ителмәй.",
-       "api-error-stashfailed": "Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.",
        "api-error-publishfailed": "Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.",
-       "api-error-stasherror": "Файлы һаҡлағысҡа тейәгән ваҡытта хата китте.",
-       "api-error-stashedfilenotfound": "Ваҡытлыса һаҡлағыстан файлы тейәгән ваҡытта сығанаҡ файл табылманы.",
-       "api-error-stashpathinvalid": "Ваҡытлыса һаҡлағыста урынлашҡан файл юлы дөрөҫ түгел.",
-       "api-error-stashfilestorage": "Файлды һаҡлағысҡа тейәгән ваҡытта хата китте.",
-       "api-error-stashzerolength": "Сервер файлды ваҡытлыса һаҡлағыста һаҡлау алмай, сөнкт оҙонлоғо 0.",
-       "api-error-stashnotloggedin": "Файлды ваҡытлыса һаҡлағысҡа урынлаштырыу өсөн һеҙ системаҡа инергә тейешһегеҙ.",
-       "api-error-stashwrongowner": "Ваҡытлыса һаҡлағыстағы файлда асырға теләнегеҙ, был файл һеҙҙеке түгел",
-       "api-error-stashnosuchfilekey": "Ваҡытлыса һаҡлағыста һеҙ асырға теләгән файлдың асҡысы юҡ.",
-       "api-error-timeout": "Көтөлгән ваҡыт эсендә сервер яуып бирмәне.",
-       "api-error-unclassified": "Билдәһеҙ хата барлыҡҡа килде.",
-       "api-error-unknown-code": "Билдәһеҙ хата: «$1»",
-       "api-error-unknown-error": "Эске хата: файлды йөкләгәндә ниндәйҙер хата китте.",
+       "api-error-stashfailed": "Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.",
        "api-error-unknown-warning": "Билдәһеҙ белдереү: \"$1\".",
        "api-error-unknownerror": "Билдәһеҙ хата: «$1»",
-       "api-error-uploaddisabled": "Был викила файл тейәү мөмкинлеге ябылған.",
-       "api-error-verification-error": "Был файл боҙолған, йәки дөрөҫ булмаған ҡушымтаһы бар.",
        "duration-seconds": "$1 {{PLURAL:$1|1=секунд|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|1=минут|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|1=сәғәт|сәғәт}}",
index 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 097ddb9..502c814 100644 (file)
        "searcharticle": "Старонка",
        "history": "Гісторыя старонкі",
        "history_short": "Гісторыя",
+       "history_small": "гісторыя",
        "updatedmarker": "абноўлена з часу майго апошняга наведваньня",
        "printableversion": "Вэрсія для друку",
        "permalink": "Сталая спасылка",
        "changeemail-no-info": "Для непасрэднага доступу да гэтай старонкі Вам неабходна ўвайсьці ў сыстэму.",
        "changeemail-oldemail": "Цяперашні адрас электроннай пошты:",
        "changeemail-newemail": "Новы адрас электроннай пошты:",
-       "changeemail-newemail-help": "Ð\9fоле Ñ\82Ñ\80Ñ\8dба Ð¿Ð°ÐºÑ\96нÑ\83Ñ\86Ñ\8c Ð¿Ñ\83Ñ\81Ñ\82Ñ\8bм, ÐºÐ°Ð»Ñ\96 Ð²Ñ\8b Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c Ñ\81вой Ð°Ð´Ñ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b. Пасьля выдаленьня вы ня зможаце ануляваць забыты пароль і ня будзеце атрымліваць лісты электроннай пошты з гэтай вікі.",
+       "changeemail-newemail-help": "Ð\9aалÑ\96 Ð²Ñ\8b Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c Ñ\81вой Ð°Ð´Ñ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b, Ð¿Ð°ÐºÑ\96нÑ\8cÑ\86е Ð³Ñ\8dÑ\82ае Ð¿Ð¾Ð»Ðµ Ð¿Ñ\83Ñ\81Ñ\82Ñ\8bм. Пасьля выдаленьня вы ня зможаце ануляваць забыты пароль і ня будзеце атрымліваць лісты электроннай пошты з гэтай вікі.",
        "changeemail-none": "(няма)",
        "changeemail-password": "Ваш пароль у {{GRAMMAR:месны|{{SITENAME}}}}:",
        "changeemail-submit": "Зьмяніць адрас электроннай пошты",
        "selfredirect": "<strong>Папярэджаньне:</strong> вы перанакіроўваеце старонку саму на сябе.\nМагчыма, вы пазначылі няслушную старонку для перанакіраваньня або вы рэдагуеце ня тую старонку.\nКалі вы націсьніце «{{int:savearticle}}» яшчэ раз, перанакіраваньне будзе створанае.",
        "missingcommenttext": "Калі ласка, увядзіце камэнтар ніжэй.",
        "missingcommentheader": "<strong>Напамін:</strong> Вы не пазначылі загаловак камэнтара. Калі Вы націсьніце кнопку «{{int:savearticle}}» яшчэ раз, Вашая зьмена будзе захаваная без камэнтара.",
-       "summary-preview": "Папярэдні прагляд апісаньня:",
+       "summary-preview": "Папярэдні прагляд апісаньня зьменаў:",
        "subject-preview": "Папярэдні прагляд загалоўку:",
        "previewerrortext": "Адбылася памылка пры спробе папярэдняга прагляду вашых зьменаў.",
        "blockedtitle": "Удзельнік заблякаваны",
        "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-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-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}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
        "rev-delundel": "паказаць/схаваць",
        "rev-showdeleted": "паказаць",
        "revisiondelete": "Выдаліць/аднавіць вэрсіі",
        "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|1=групы|групаў}}:",
+       "group-membership-link-with-expiry": "$1 (да $2)",
        "prefs-registration": "Час рэгістрацыі:",
        "yourrealname": "Сапраўднае імя:",
        "yourlanguage": "Мова інтэрфэйсу:",
        "editusergroup": "Загрузіць групы ўдзельніка",
        "editinguser": "Зьмена правоў {{GENDER:$1|удзельніка|удзельніцы}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Прагляд правоў {{GENDER:$1|удзельніка|удзельніцы}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Рэдагаваць групы ўдзельнікаў і ўдзельніц",
-       "userrights-viewusergroup": "Прагляд групаў удзельніка",
+       "userrights-editusergroup": "Рэдагаваць групы {{GENDER:$1|ўдзельніка|ўдзельніцы}}",
+       "userrights-viewusergroup": "Прагляд групаў {{GENDER:$1|удзельніка|удзельніцы}}",
        "saveusergroups": "Захаваць групы {{GENDER:$1|ўдзельнікаў і ўдзельніц}}",
        "userrights-groupsmember": "Уваходзіць у:",
        "userrights-groupsmember-auto": "Няяўны чалец:",
-       "userrights-groups-help": "ТÑ\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-changeable-col": "Групы, якія Вы можаце мяняць",
        "userrights-unchangeable-col": "Групы, якія Вы ня можаце мяняць",
+       "userrights-expiry-current": "Сканчаецца $1",
+       "userrights-expiry-none": "Бестэрмінова",
+       "userrights-expiry": "Сканчаецца:",
+       "userrights-expiry-existing": "Цяперашні час сканчэньня: $3 $2",
+       "userrights-expiry-othertime": "Іншы час:",
+       "userrights-expiry-options": "1 дзень:1 day,1 тыдзень:1 week,1 месяц:1 month,3 месяцы:3 months,6 месяцаў:6 months,1 год:1 year",
+       "userrights-invalid-expiry": "Тэрмін заканчэньня для групы «$1» зьяўляецца няслушным.",
+       "userrights-expiry-in-past": "Час заканчэньня для групы «$1» знаходзіцца ў мінулым.",
+       "userrights-cannot-shorten-expiry": "Вы ня можаце падоўжыць час дзеяньня групы «$1». Толькі ўдзельнікі з правамі на дадаваньне і выдаленьне гэтай групы могуць падаўжаць час дзеяньня.",
        "userrights-conflict": "Канфлікт пры зьмене правоў удзельнікаў! Калі ласка, праверце і захавайце вашыя зьмены.",
        "group": "Група:",
        "group-user": "Удзельнікі",
        "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-feedbacklink": "Пакінуць водгук пра новыя (бэта) фільтры",
+       "rcfilters-highlightbutton-title": "Вылучыць вынікі",
+       "rcfilters-highlightmenu-title": "Абярыце колер",
+       "rcfilters-highlightmenu-help": "Абярыце колер для вылучэньня гэтай уласьцівасьці",
+       "rcfilters-filterlist-noresults": "Фільтры ня знойдзеныя",
+       "rcfilters-filtergroup-registration": "Рэгістрацыя ўдзельнікаў",
+       "rcfilters-filter-registered-label": "Зарэгістраваныя",
+       "rcfilters-filter-registered-description": "Рэдактары, якія ўвайшлі ў сыстэму.",
+       "rcfilters-filter-unregistered-label": "Незарэгістраваныя",
+       "rcfilters-filter-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-файлаў забароненая ў мэтах бясьпекі.",
        "statistics-users-active-desc": "Удзельнікі, якія выканалі нейкае дзеяньне цягам {{PLURAL:$1|апошняга $1 дня|апошніх $1 дзён|апошніх $1 дзён}}",
        "pageswithprop": "Старонкі з уласьцівасьцямі старонак",
        "pageswithprop-legend": "Старонкі з уласьцівасьцямі старонак",
-       "pageswithprop-text": "Ð\9dа Ð³Ñ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b Ð°Ð´Ð»Ñ\8eÑ\81Ñ\82Ñ\80оÑ\9eваÑ\8eÑ\86Ñ\86а Ñ\81Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ñ\9eжÑ\8bваÑ\8eÑ\86Ñ\8c Ð¿Ñ\8dÑ\9eнÑ\8bÑ\8f Ñ\9eлаÑ\81Ñ\8cÑ\86Ñ\96ваÑ\81Ñ\8cÑ\86Ñ\96 Ñ\81Ñ\82аÑ\80онак",
+       "pageswithprop-text": "Ð\9dа Ð³Ñ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b Ð°Ð´Ð»Ñ\8eÑ\81Ñ\82Ñ\80оÑ\9eваÑ\8eÑ\86Ñ\86а Ñ\81Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ñ\9eжÑ\8bваÑ\8eÑ\86Ñ\8c Ð¿Ñ\8dÑ\9eнÑ\83Ñ\8e Ñ\9eлаÑ\81Ñ\8cÑ\86Ñ\96ваÑ\81Ñ\8cÑ\86Ñ\8c Ñ\81Ñ\82аÑ\80онкÑ\96.",
        "pageswithprop-prop": "Імя ўласьцівасьці:",
        "pageswithprop-submit": "Паказаць",
        "pageswithprop-prophidden-long": "доўгае тэкставае значэньне ўласьцівасьці схавана ($1)",
        "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».",
        "emailccsubject": "Копія Вашага ліста да $1: $2",
        "emailsent": "Ліст адасланы",
        "emailsenttext": "Ваш ліст быў адасланы.",
-       "emailuserfooter": "Гэты ліст быў дасланы {{GENDER:$1|ўдзельнікам|ўдзельніцай}} $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «{{int:emailuser}}» {{GRAMMAR:родны|{{SITENAME}}}}. {{GENDER:$2|Ваш}} ліст у адказ будзе дасланы {{GENDER:$1|адпраўніку|адпраўніцы}}, і {{GENDER:$1|яму|ёй}} будзе бачны {{GENDER:$2|ваш}} адрас электроннай пошты.",
+       "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Калі ласка, націсьніце «назад» і перазагрузіце старонку, зь якой Вы прыйшлі, і паспрабуйце ізноў.",
        "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": "Вы ня можаце блякаваць ці раблякоўваць іншых удзельнікаў, таму што заблякаваныя самі",
        "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-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-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": "сэсіі на падставе файлаў-кукі",
        "authmanager-authn-not-in-progress": "Аўтэнтыфікацыя не выконваецца або страчаныя зьвесткі пра сэсію. Калі ласка, пачніце зноў з самага пачатку.",
        "authmanager-authn-no-primary": "Пададзеныя ўліковыя зьвесткі ня могуць быць правераныя на сапраўднасьць.",
        "authmanager-authn-no-local-user": "Пададзеныя ўліковыя зьвесткі не зьвязаныя зь ніводным удзельнікам гэтай вікі.",
+       "authmanager-authn-no-local-user-link": "Пададзеныя ўліковыя зьвесткі зьяўляюцца карэктнымі, але не належаць ніводнаму ўдзельніку гэтай вікі. Увайдзіце іншым шляхам, або стварыце новага ўдзельніка і ў вас будзе магчымасьць злучыць вашыя папярэднія ўліковыя зьвесткі з гэтым рахункам.",
        "authmanager-authn-autocreate-failed": "Аўтаматычнае стварэньне лякальнага рахунку не атрымалася: $1",
        "authmanager-change-not-supported": "Пададзеныя ўліковыя зьвесткі ня могуць быць зьмененыя, бо яны ня будуць выкарыстаныя.",
+       "authmanager-create-disabled": "Стварэньне рахункаў адключанае.",
+       "authmanager-create-from-login": "Каб стварыць рахунак, калі ласка, запоўніце палі.",
+       "authmanager-create-not-in-progress": "Стварэньне рахунку не выконваецца або страчаныя зьвесткі пра сэсію. Калі ласка, пачніце наноў з самага пачатку.",
+       "authmanager-create-no-primary": "Пададзеныя ўліковыя зьвесткі ня могуць быць выкарыстаныя для стварэньня рахунку.",
+       "authmanager-link-no-primary": "Пададзеныя ўліковыя зьвесткі ня могуць быць выкарыстаныя для злучэньня рахункаў.",
+       "authmanager-link-not-in-progress": "Злучэньне рахункаў не выконваецца або страчаныя зьвесткі сэсіі. Калі ласка, пачніце ізноў спачатку.",
+       "authmanager-authplugin-setpass-failed-title": "Памылка зьмены паролю",
+       "authmanager-authplugin-setpass-failed-message": "Дадатак аўтэнтыфікацыі адмовіў зьмену паролю.",
        "authmanager-realname-label": "Сапраўднае імя",
        "authmanager-provider-temporarypassword": "Часовы пароль",
        "changecredentials": "Зьмена ўліковых зьвестак",
index d8a0a8c..0f9d186 100644 (file)
        "searcharticle": "Артыкул",
        "history": "Гісторыя старонкі",
        "history_short": "Гісторыя",
+       "history_small": "гісторыя",
        "updatedmarker": "абноўлена ад часу апошняга наведвання",
        "printableversion": "Для друку",
        "permalink": "Нязменная спасылка",
        "jumpto": "Перайсці да:",
        "jumptonavigation": "рух",
        "jumptosearch": "знайсці",
-       "view-pool-error": "Ð\9dа Ð¶Ð°Ð»Ñ\8c, Ñ\83 Ð³Ñ\8dÑ\82Ñ\8b Ð¼Ð¾Ð¼Ð°Ð½Ñ\82 Ñ\81еÑ\80веÑ\80Ñ\8b Ð¿ÐµÑ\80агÑ\80Ñ\83жанÑ\8b.\nÐ\97анадÑ\82а Ð¼Ð½Ð¾Ð³Ñ\96Ñ\8f Ñ\87Ñ\8bÑ\82аÑ\87Ñ\8b Ñ\81пÑ\80абÑ\83Ñ\8eÑ\86Ñ\8c адкрыць гэтую старонку.\nКалі ласка, трохі пачакайце, перш чым адкрываць гэтую старонку ізноў.\n\n$1",
+       "view-pool-error": "Ð\9dа Ð¶Ð°Ð»Ñ\8c, Ñ\83 Ð³Ñ\8dÑ\82Ñ\8b Ð¼Ð¾Ð¼Ð°Ð½Ñ\82 Ñ\81еÑ\80веÑ\80Ñ\8b Ð¿ÐµÑ\80агÑ\80Ñ\83жанÑ\8b.\nÐ\92елÑ\8cмÑ\96 Ñ\88маÑ\82 Ñ\87Ñ\8bÑ\82аÑ\87оÑ\9e Ñ\81пÑ\80абÑ\83е адкрыць гэтую старонку.\nКалі ласка, трохі пачакайце, перш чым адкрываць гэтую старонку ізноў.\n\n$1",
        "generic-pool-error": "На жаль, у гэты момант серверы перагружаны.\nЗанадта многія карыстальнікі спрабуюць адкрыць гэты рэсурс.\nКалі ласка, трохі пачакайце, перш чым спрабаваць атрымаць доступ да гэтага рэсурсу ізноў.",
        "pool-timeout": "Выйшаў час чакання блакіроўкі",
        "pool-queuefull": "Чарга запытаў перапоўнена",
        "parser-template-loop-warning": "Цыклічнае ўключэнне шаблона: [[$1]]",
        "parser-template-recursion-depth-warning": "Вычарпаны ліміт глыбіні ўключэння шаблонаў ($1)",
        "language-converter-depth-warning": "Перавышана глыбіня моўнага канвертэра ($1)",
-       "node-count-exceeded-category": "СÑ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð¿ÐµÑ\80аÑ\81Ñ\8fгнÑ\83лÑ\96 ÐºÐ¾Ð»Ñ\8cкаÑ\81Ñ\86Ñ\8c ÐºÑ\80опак",
+       "node-count-exceeded-category": "СÑ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð¿ÐµÑ\80аÑ\81Ñ\8fгнÑ\83лÑ\96 ÐºÐ¾Ð»Ñ\8cкаÑ\81Ñ\86Ñ\8c Ð²Ñ\83злоÑ\9e",
        "node-count-exceeded-category-desc": "На старонцы перавышана максімальная колькасць кропак.",
-       "node-count-exceeded-warning": "СÑ\82аÑ\80онка Ð¿ÐµÑ\80аÑ\81Ñ\8fгнÑ\83ла ÐºÐ¾Ð»Ñ\8cкаÑ\81Ñ\86Ñ\8c ÐºÑ\80опак",
+       "node-count-exceeded-warning": "СÑ\82аÑ\80онка Ð¿ÐµÑ\80аÑ\81Ñ\8fгнÑ\83ла ÐºÐ¾Ð»Ñ\8cкаÑ\81Ñ\86Ñ\8c Ð²Ñ\83злоÑ\9e",
        "expansion-depth-exceeded-category": "Старонкі, якія перасягнулі глыбіню разгортвання",
        "expansion-depth-exceeded-category-desc": "На старонцы перасягнута максімальная глыбіня разгортвання.",
        "expansion-depth-exceeded-warning": "Старонка перасягнула глыбіню разгортвання",
        "saveprefs": "Запісаць",
        "restoreprefs": "Аднавіць усе прадвызначэнні (ва ўсіх раздзелах)",
        "prefs-editing": "Праца",
-       "rows": "Радкі:",
-       "columns": "Калонкі:",
        "searchresultshead": "Пошук",
        "stub-threshold": "Парог для паказу спасылкі як на пачатковы артыкул ($1):",
        "stub-threshold-sample-link": "прыклад",
        "youremail": "Эл.пошта *",
        "username": "Імя {{GENDER:$1|ўдзельніка|ўдзельніцы}}:",
        "prefs-memberingroups": "Уваходзіць у {{PLURAL:$1|групу|групы}}:",
+       "group-membership-link-with-expiry": "$1 (да $2)",
        "prefs-registration": "Час рэгістрацыі:",
        "yourrealname": "Сапраўднае імя:",
        "yourlanguage": "Мова:",
        "userrights-nodatabase": "Не знойдзена тут, або не існуе база даных $1.",
        "userrights-changeable-col": "Групы, якія вам дазволена мяняць",
        "userrights-unchangeable-col": "Групы, якія вам не дазволена мяняць",
+       "userrights-expiry-current": "Канчаецца $1",
+       "userrights-expiry-none": "Бестэрмінова",
+       "userrights-expiry": "Канчаецца:",
+       "userrights-expiry-existing": "Цяперашні час сканчэння: $3, $2",
+       "userrights-expiry-othertime": "Іншы час:",
        "userrights-conflict": "Канфлікт змянення ўдзельніцкіх дазволаў! Калі ласка, праверце і пацвердзіце змены.",
        "group": "Група:",
        "group-user": "Удзельнікі",
        "action-reupload-shared": "запісваць паўзверх гэтага файла ў супольным сховішчы",
        "action-upload_by_url": "загрузіць гэты файл з адраса URL",
        "action-writeapi": "ужываць API запісвання",
-       "action-delete": "сціраць гэтую старонку",
+       "action-delete": "выдаліць гэтую старонку",
        "action-deleterevision": "сціраць версіі старонак",
        "action-deletelogentry": "выдаленне запісаў у журнале",
        "action-deletedhistory": "бачыць сцёртую гісторыю гэтай старонкі",
        "recentchanges-label-minor": "Дробная па значэнні праўка",
        "recentchanges-label-bot": "Праўка зроблена праграмай-робатам",
        "recentchanges-label-unpatrolled": "Праўка яшчэ не атрымала адзнакі ўхваленасці (за ёй не сочыць \"патруль\")",
-       "recentchanges-label-plusminus": "Ð\90б'Ñ\91м Ñ\81Ñ\82аÑ\80онкÑ\96 Ð·Ð¼Ñ\8fнÑ\96Ñ\9eÑ\81Ñ\8f Ð½Ð° Ð³Ñ\8dÑ\82Ñ\83Ñ\8e Ð»Ñ\96Ñ\87бÑ\83 байтаў",
+       "recentchanges-label-plusminus": "Ð\90б'Ñ\91м Ñ\81Ñ\82аÑ\80онкÑ\96 Ð·Ð¼Ñ\8fнÑ\96Ñ\9eÑ\81Ñ\8f Ð½Ð° Ð³Ñ\8dÑ\82Ñ\8b Ð»Ñ\96к байтаў",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (гл. асобна [[Special:NewPages|новыя старонкі]])",
        "recentchanges-submit": "Паказаць",
+       "rcfilters-filter-userExpLevel-learner-description": "Болей дзён актыўнасці і правак, чым у «навічкоў», але меней чым у «дасведчаных удзельнікаў».",
+       "rcfilters-filter-userExpLevel-experienced-description": "Больш за 30 дзён актыўнасці і 500 правак.",
+       "rcfilters-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.",
        "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": "Дазволы для груп удзельнікаў",
        "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": "Назвы вытока і мэты такія самыя; нельга пераносіць старонку саму на сябе.",
        "feedback-thanks-title": "Дзякуем!",
        "searchsuggest-search": "Шукаць у {{GRAMMAR:месны|{{SITENAME}}}}",
        "searchsuggest-containing": "змяшчае...",
-       "api-error-badaccess-groups": "У Вас няма дазволу загружаць файлы ў гэтую вікі.",
        "api-error-badtoken": "Унутраная памылка: няслушны ключ.",
-       "api-error-copyuploaddisabled": "Загрузка з URL-адраса забаронена на гэтым серверы.",
-       "api-error-duplicate": "Ужо {{PLURAL:$1|існуе іншы файл|існуюць іншыя файлы}} з такім жа зместам.",
-       "api-error-duplicate-archive": "Раней на сайце {{PLURAL:$1|ўжо быў файл|былі файлы}} з дакладна такім жа зместам, але {{PLURAL:$1|ён быў выдалены|яны былі выдаленыя}}.",
-       "api-error-empty-file": "Дасланы Вамі файл быў пусты.",
        "api-error-emptypage": "Стварэнне новых пустых старонак забаронена.",
-       "api-error-fetchfileerror": "Унутраная памылка: падчас атрымання файла штосьці здарылася.",
-       "api-error-fileexists-forbidden": "Файл з назвай \"$1\" ужо ёсць і не можа быць перапісаны.",
-       "api-error-fileexists-shared-forbidden": "Файл з назвай \"$1\" ужо ёсць у супольным сховішчы файлаў, ён не можа быць перапісаны.",
-       "api-error-file-too-large": "Дасланы Вамі файл занадта вялікі.",
-       "api-error-filename-tooshort": "Імя файла занадта кароткае.",
-       "api-error-filetype-banned": "Гэты тып файлаў забаронены.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|належыць да недазволенага тыпу файлаў|належаць да недазволеных тыпаў файлаў}}. Пералік дазволеных тыпаў складаецца з {{PLURAL:$3|тыпу|тыпаў}}: $2.",
-       "api-error-filetype-missing": "У файла няма пашырэння.",
-       "api-error-hookaborted": "Прапанаванае вамі змяненне было адменена ў апрацоўшчыку пашырэння.",
-       "api-error-http": "Унутраная памылка: немагчыма далучыцца да сервера.",
-       "api-error-illegal-filename": "Імя файла не дапускаецца.",
-       "api-error-internal-error": "Унутраная памылка: падчас апрацоўкі Вашага файла штосьці здарылася.",
-       "api-error-invalid-file-key": "Унутраная памылка: не быў знойдзены часовы файл.",
-       "api-error-missingparam": "Унутраная памылка: запыт бракуе параметраў.",
-       "api-error-missingresult": "Унутраная памылка: немагчыма вызначыць, ці паспяхова зробленае капіяванне.",
-       "api-error-mustbeloggedin": "Для загрузкі файлаў неабходна ўвайсці ў сістэму.",
-       "api-error-mustbeposted": "Памылка гэтага праграмнага забеспячэння; яно не выкарыстоўвае слушны HTTP-метад.",
-       "api-error-noimageinfo": "Файл загружаны, але сервер не даў пра яго ніякай інфармацыі.",
-       "api-error-nomodule": "Унутраная памылка: не выбраны модуль загрузкі.",
-       "api-error-ok-but-empty": "Унутраная памылка: няма адказу ад сервера.",
-       "api-error-overwrite": "Замена існуючага файла не дапускаецца.",
-       "api-error-stashfailed": "Унутраная памылка: сервер не змог захаваць часовы файл.",
        "api-error-publishfailed": "Унутраная памылка: сервер не змог апублікаваць тымчасовы файл.",
-       "api-error-stasherror": "У час укладання файла ў сховішча здарылася памылка.",
-       "api-error-timeout": "Сервер не адказаў у чаканы тэрмін.",
-       "api-error-unclassified": "Узнікла невядомая памылка",
-       "api-error-unknown-code": "Невядомая памылка: «$1».",
-       "api-error-unknown-error": "Унутраная памылка: падчас загрузкі файла здарылася штосьці невядомае.",
+       "api-error-stashfailed": "Унутраная памылка: сервер не змог захаваць часовы файл.",
        "api-error-unknown-warning": "Невядомае папярэджанне: $1",
        "api-error-unknownerror": "Невядомая памылка: «$1».",
-       "api-error-uploaddisabled": "Загрузка ў гэтую вікі адключаная.",
-       "api-error-verification-error": "Гэты файл можа быць пашкоджаны, ці мае няслушны канчатак назвы.",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунды|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|мінута|мінуты|мінут}}",
        "duration-hours": "$1 {{PLURAL:$1|гадзіна|гадзіны|гадзін}}",
index 2ec3bc7..41076d3 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": "Преглед на страница",
        "continue-editing": "Продължаване към полето за редактиране",
        "previewconflict": "Този предварителен преглед отразява текста в горната текстова кутия така, както би се показал, ако съхраните.",
        "session_fail_preview": "За съжаление редакцията ви не успя да бъде обработена поради загуба на данните за текущата сесия.\n\nМоже би сте излезли от системата. <strong>Моля, уверете се, че сте влезли в профила си и опитайте отново.</strong>\nАко все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново, също така проверете дали браузърът ви позволява бисквитки от този сайт.",
-       "session_fail_preview_html": "'''За съжаление редакцията ви не беше записана поради изтичането на сесията ви.'''\n\n''Тъй като {{SITENAME}} приема обикновен HTML, предварителният преглед е скрит като предпазна мярка срещу атаки чрез Джаваскрипт.''\n\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-nodatabase": "Базата данни $1 не съществува или не е на локалния сървър.",
        "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": "Изнасяне на страници, включително свързаните с тях в дълбочина до пето ниво",
        "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": "Възвръщане на файла",
        "withoutinterwiki-summary": "Следните страници не препращат към версии на други езици:",
        "withoutinterwiki-legend": "Представка",
        "withoutinterwiki-submit": "Показване",
-       "fewestrevisions": "Страници с най-малко версии",
+       "fewestrevisions": "Страници с най-малко редакции",
        "nbytes": "$1 {{PLURAL:$1|байт|байта}}",
        "ncategories": "$1 {{PLURAL:$1|категория|категории}}",
        "ninterwikis": "$1 {{PLURAL:$1|междууики|междууикита}}",
        "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}}.",
        "editcomment": "Резюмето на редакцията беше: <em>$1</em>.",
        "revertpage": "Премахване на [[Special:Contributions/$2|редакции на $2]] ([[User talk:$2|беседа]]); възвръщане към последната версия на [[User:$1|$1]]",
        "revertpage-nouser": "Премахнати редакции на (скрито потребителско име) и връщане към последната версия на [[User:$1|$1]]",
-       "rollback-success": "Отменени редакции на $1; възвръщане към последната версия на $2.",
+       "rollback-success": "Отменени редакции на {{GENDER:$3|$1}};\nвъзвръщане към последната версия на {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Прекъсната сесия",
        "sessionfailure": "Изглежда има проблем със сесията ви; действието беше отказано като предпазна мярка срещу крадене на сесията. Натиснете бутона за връщане на браузъра, презаредете страницата, от която сте дошли, и опитайте отново.",
        "changecontentmodel-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": "Търсене на изтрити страници",
        "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-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-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|час|часа}}",
        "pagelang-language": "Език",
        "pagelang-use-default": "Използване на езика по подразбиране",
        "pagelang-select-lang": "Избиране на език",
+       "pagelang-reason": "Причина",
        "pagelang-submit": "Изпращане",
        "right-pagelang": "Промяна езика на страница",
        "action-pagelang": "промяна езика на страницата",
        "log-name-pagelang": "Дневник на езиковите промени",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (включено)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>изключено</strong>)",
-       "mediastatistics": "Ð\9cедиÑ\8f Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82ики",
+       "mediastatistics": "СÑ\82аÑ\82иÑ\81Ñ\82ика Ð·Ð° Ñ\84айлове",
        "mediastatistics-table-mimetype": "MIME тип",
        "mediastatistics-table-extensions": "Възможни разширения",
        "mediastatistics-table-count": "Брой файлове",
index cdc13ad..af8c1e1 100644 (file)
        "index-category": "آ تاکدیمان که دیسته بوته گنت",
        "noindex-category": "آ تاکدیمان که ایندیکس نه بوته‌انت",
        "broken-file-category": "تاکدیمان گو خرابین لینکان بی فایلا",
-       "about": "بی باره ها",
+       "about": "بِه باره‌ئا",
        "article": "محتوائین تاکدیم",
        "newwindow": "(نوکین دروازگئ تا پاچ بکنێت)",
        "cancel": "کنسیل",
        "pool-errorunknown": "ناشناخته ئین خطا",
        "pool-servererror": "پول سنتر سرویس بی دسترس ئا نه اینت ( $1 ).",
        "poolcounter-usage-error": "خطا استفاده شه: $1",
-       "aboutsite": "بی بارها {{SITENAME}}",
+       "aboutsite": "مالومات بِه {{SITENAME}}ئي باره‌ئا",
        "aboutpage": "Project:بِه باره‌ئا",
        "copyright": "محتوایات بی  $1 اجازه نامه ئا هستنت مگه ای که آی خلاف ئا ذکر بوته بیئنت .",
        "copyrightpage": "{{ns:project}}:کاپی رایت یا باز کورتینی حق",
        "saveprefs": "ذخیره",
        "restoreprefs": "بیر گردینتین موچین تنظیمان بی اولی ئین رقما",
        "prefs-editing": "ایڈیٹ کورتین",
-       "rows": "تعداد سطرها:",
-       "columns": "تعداد ستون‌ها:",
        "searchresultshead": "گشتین",
        "stub-threshold": "آستانه په کۆنڈ لینکاني قالب بندیا ($1):",
        "stub-threshold-sample-link": "نمونه",
        "uploaddisabled": "بُرز کورتین غیر پئال اینت.",
        "copyuploaddisabled": "بُرز کورتین شه اینترنیتی ادرسا غیرفعال اینت.",
        "uploaddisabledtext": "فایل ئی بُرز کورتین غیر فعال اینت.",
-       "uploadscriptednamespace": "این اس‌وی‌جی ئی پوشه شامل غیرقانونی ئین  '$1' ئی پزای نام ئا اینت",
+       "uploadscriptednamespace": "این اس‌وی‌جی ئی پوشه شامل غیرقانونی ئین  '<nowiki>$1</nowiki>' ئی پزای نام ئا اینت",
        "uploadinvalidxml": "XML بئ بُرز بوته ئین پایل تا نتوانت تجزیه بیئت.",
        "uploadvirus": "ای پایل ویروس داریت!\nگیشتیرین مه لومات : $1",
        "upload-source": "فایلی منشا",
        "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 سائت",
index 244ac7a..4e4401e 100644 (file)
        "tog-watchuploads": "हम नया फाइल अपलोड करीं त उनहना के हमार धियानसूची में जोड़ल जाय",
        "tog-watchrollback": "हमरा द्वारा रोलबैक कइल गइल पन्ना सभ के हमार धियानसूची में जोड़ल जाव",
        "tog-minordefault": "डिफाल्ट रूप से सगरी संपादन के छोट संपादन की रुप में चिन्हित कइल जाव",
-       "tog-previewontop": "झलक (प्रीव्यू) संपादन बक्सा से पहिले देखावल जाय",
-       "tog-previewonfirst": "पहिला संपादन पर झलक (प्रीव्यू) देखावल जाय",
-       "tog-enotifwatchlistpages": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¦à¤°à¥\8dà¤\9c कौनो भी पन्ना या फाइल में बदलाव होखला पर हमके ईमेल कइल जाव",
+       "tog-previewontop": "झलक के संपादन बक्सा से पहिले देखावल जाय",
+       "tog-previewonfirst": "पहिला संपादन पर झलक देखावल जाय",
+       "tog-enotifwatchlistpages": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\81ड़ल कौनो भी पन्ना या फाइल में बदलाव होखला पर हमके ईमेल कइल जाव",
        "tog-enotifusertalkpages": "अगर हमरे बातचीत पन्ना पर कौनो बदलाव होखे त हमके ईमेल कइल जाव",
-       "tog-enotifminoredits": "पन्ना आ फाइल पर छोटो बदलाव होखे त हमके ईमेल कइल जाव",
+       "tog-enotifminoredits": "पन्ना आ फाइल पर छोट बदलाव होखे तबो हमके ईमेल कइल जाव",
        "tog-enotifrevealaddr": "नोटिफिकेशन ईमेल में हमार ईमेल पता देखावल जाव",
-       "tog-shownumberswatching": "धियान à¤°à¤\96à¥\87 à¤µà¤¾à¤²à¤¨ à¤¸à¤¦à¤¸à¥\8dयन के संख्या देखावल जाव",
+       "tog-shownumberswatching": "धियान à¤°à¤\96à¥\87 à¤µà¤¾à¤²à¤¾ à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 के संख्या देखावल जाव",
        "tog-oldsig": "राउर वर्तमान दसखत:",
        "tog-fancysig": "दसखत के विकी पाठ के रुप में उपयोग करीं (बिना ऑटोमेटिक कड़ी के)",
        "tog-uselivepreview": "लगातार झलक (लाइव प्रीव्यू) इस्तेमाल कइल जाव",
-       "tog-forceeditsummary": "सà¤\82पादन à¤¸à¤\82à¤\9bà¥\87प ना भरल गइल होखे त हमके सूचित कइल जाय",
+       "tog-forceeditsummary": "सà¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श ना भरल गइल होखे त हमके सूचित कइल जाय",
        "tog-watchlisthideown": "धियानसूची से हमार खुद के संपादन छिपावल जाय",
        "tog-watchlisthidebots": "धियानसूची से बॉट संपादन छिपावल जाय",
        "tog-watchlisthideminor": "धियानसूची से छोट संपादन छिपावल जाय",
        "tog-watchlisthidecategorization": "पन्ना श्रेणीकरण छिपावल जाय",
        "tog-ccmeonemails": "हमरा द्वारा अन्य प्रयोगकर्ता लोग के भेजल गइल ईमेल के कॉपी हमके भेजल जाय",
        "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-useeditwarning": "à¤\95à¥\8cनà¥\8bà¤\82 à¤¸à¤\82पादन à¤\95रत à¤\98रà¥\80 à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¤¹à¥\87à¤\9cलà¥\87 à¤ªà¤¨à¥\8dना छोड़ देईं त हमके खबर कइल जाय",
        "tog-prefershttps": "खाता में प्रवेश रहले पर हमेशा सुरक्षित कनेक्शन के प्रयोग कइल जाय",
        "underline-always": "हमेशा",
        "underline-never": "कभी ना",
-       "underline-default": "à¤\9cिलà¥\8dद (सà¥\8dà¤\95िन) या ब्राउजर डिफॉल्ट",
+       "underline-default": "सà¥\8dà¤\95िन या ब्राउजर डिफॉल्ट",
        "editfont-style": "संपादन क्षेत्र के फॉन्ट स्टाइल:",
        "editfont-default": "ब्राउजर डिफाल्ट",
        "editfont-monospace": "मोनोस्पेस्ड फोंट",
        "listingcontinuesabbrev": "जारी...",
        "index-category": "सूचीबद्ध पन्ना",
        "noindex-category": "बिनासूचीबद्ध पन्ना",
-       "broken-file-category": "à¤\9fà¥\82à¤\9fल à¤«à¤¾à¤\87ल à¤\95ड़ियन वाला पन्ना",
+       "broken-file-category": "à¤\97ायब à¤«à¤¾à¤\87ल वाला पन्ना",
        "about": "बारे में",
        "article": "सामग्री पन्ना",
        "newwindow": "(नया विंडो में खोलीं)",
        "searcharticle": "जाईं",
        "history": "पन्ना के इतिहास",
        "history_short": "इतिहास",
+       "history_small": "इतिहास",
        "updatedmarker": "हमरे अंतिम बेर देखले के बाद के बदलाव",
        "printableversion": "छापे लायक संस्करण",
        "permalink": "स्थायी कड़ी",
        "print": "छापीं",
-       "view": "वà¥\8dयà¥\82",
+       "view": "दà¥\87à¤\96à¥\80à¤\82",
        "view-foreign": "$1 पर देखीं",
        "edit": "संपादन",
-       "edit-local": "लà¥\8bà¤\95ल à¤µà¤¿à¤µà¤°à¤£ à¤¦à¥\87à¤\96à¥\80à¤\82",
+       "edit-local": "लà¥\8bà¤\95ल à¤µà¤¿à¤µà¤°à¤£ à¤¸à¤\82पादन",
        "create": "बनाईं",
        "create-local": "लोकल विवरण जोड़ीं",
        "editthispage": "ए पन्ना के संपादन करीं",
        "create-this-page": "ई पन्ना बनाईं",
-       "delete": "मिटाईं",
-       "deletethispage": "à¤\88 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤®à¤¿टाईं",
-       "undeletethispage": "à¤\88 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤«à¤¿à¤° à¤¸à¥\87 à¤¸à¥\8dथापित à¤\95रà¥\80ं",
-       "undelete_short": "{{PLURAL:$1|à¤\8fà¤\95 à¤ à¥\8b à¤¹à¤\9fावल à¤\97à¤\87ल à¤¸à¤\82पादन|$1 à¤ à¥\87 à¤¹à¤\9fावल à¤\97à¤\87ल à¤¸à¤\82पादन à¤\95à¥\81ल}} à¤¬à¤¿à¤¨à¤¾à¤®à¥\87à¤\9fावल à¤\95रà¥\80ं",
-       "viewdeleted_short": "{{PLURAL:$1|एक ठो हटावल गइल संपादन|$1 हटावल गइल संपादन कुल}} देखीं",
+       "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à¤\88ं",
+       "viewdeleted_short": "{{PLURAL:$1|एक ठो हटावल गइल संपादन|$1 हटावल गइल संपादन}} देखीं",
        "protect": "सुरक्षित करीं",
        "protect_change": "बदलीं",
        "protectthispage": "ए पन्ना के सुरक्षित करीं।",
        "personaltools": "निजी औजार",
        "articlepage": "सामग्री पन्ना देखीं",
        "talk": "बातचीत",
-       "views": "वà¥\8dयà¥\82",
+       "views": "बिबिध à¤°à¥\82प",
        "toolbox": "औजार",
        "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": "सनेसा पन्ना देखीं",
        "templatepage": "टेम्पलेट पन्ना देखीं",
        "jumptosearch": "खोजीं",
        "view-pool-error": "माफ करीं, ए समय सर्वर पर बहुत ज्यादा लोड बढ़ गइल बा।\nए पन्ना के बहुते प्रयोगकर्ता लोग देखे के कोशिश कर रहल बा।\nए पन्ना के फिर से देखे से पहिले कृपया कुछ देर तक इंतजार करीं।\n\n$1",
        "generic-pool-error": "माफ करीं, ए समय सर्वर पर बहुत ज्यादा लोड बढ़ गइल बा।\nए संसाधन के बहुते प्रयोगकर्ता लोग देखे के कोशिश कर रहल बा।\nए संसाधन तक पहुँच बनावे के कोशिश से पहिले कृपया कुछ देर तक इंतजार करीं।",
-       "pool-timeout": "तालाबनà¥\8dदà¥\80 à¤\96ातिर इंतजार समय समाप्त",
-       "pool-queuefull": "पà¥\82ल à¤ªà¤\82à¤\95à¥\8dति à¤­à¤° à¤\97à¤\87ल",
+       "pool-timeout": "तालाबà¤\82दà¥\80 à¤\96à¥\81लà¥\87 à¤\95à¥\87 इंतजार समय समाप्त",
+       "pool-queuefull": "पà¥\82ल à¤\95तार à¤­à¤°à¤² à¤¬à¤¾",
        "pool-errorunknown": "नामालूम खराबी",
        "pool-servererror": "पूल काउंटर सर्विस उपलब्ध नइखे ($1)।",
        "poolcounter-usage-error": "इस्तमाल खराबी: $1",
        "badaccess": "परमीशन खराबी",
        "badaccess-group0": "जवन कार्रवाई के माँग कइले बानी, ओकरा लागू करे के इजाजत रउआँ के नइखे।",
        "badaccess-groups": "रउआ जौन कारवाई के माँग कइले बानी ऊ {{PLURAL:$2|$1 मंडली|$1 मंडली सभ}} के सदस्य लोग भर कर सकत बा।",
-       "versionrequired": "मिडà¥\80याविà¤\95à¥\80 à¤\95à¥\87 à¤¸à¤\82सà¥\8dà¤\95रण $1 के होखल जरुरी बा",
+       "versionrequired": "मिडà¥\80याविà¤\95à¥\80 à¤\95à¥\87 à¤µà¤°à¥\8dशन $1 के होखल जरुरी बा",
        "versionrequiredtext": "ए पन्ना के प्रयोग करे खातिर मीडियाविकी के वर्शन $1 जरूरी बा।\n[[Special:Version|वर्शन पन्ना]] देखीं।",
        "ok": "ठीक",
        "retrievedfrom": "\"$1\" से लिहल गइल",
-       "youhavenewmessages": "रउआ लगे बा $1 ($2).",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|रà¤\89वाà¤\81 à¤\96ातिर}}{{PLURAL:$3|à¤\85à¤\89रà¥\80 प्रयोगकर्ता के|$3 प्रयोगकर्ता लोग}} के $1 बा ($2)।",
+       "youhavenewmessages": "{{PLURAL:$3|रउआँ खातिर}} $1 ($2) बा।",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|रà¤\89वाà¤\81 à¤\96ातिर}}{{PLURAL:$3|à¤\95à¥\87हà¥\82 प्रयोगकर्ता के|$3 प्रयोगकर्ता लोग}} के $1 बा ($2)।",
        "youhavenewmessagesmanyusers": "रउवाँ खातिर कई प्रयोगकर्ता लोग के भेजल $1 बा ($2)।",
        "newmessageslinkplural": "{{PLURAL:$1|नया सनेसा|999=नया सनेसा सभ}}",
        "newmessagesdifflinkplural": "पिछला {{PLURAL:$1|बदलाव|999=बदलाव}}",
        "viewdeleted": "$1 देखावल जाय?",
        "restorelink": "{{PLURAL:$1|एक ठो हटावल संपादन|$1 ठे हटावल संपादन}}",
        "feedlinks": "फीड:",
-       "feed-invalid": "अवैध सबस्क्रिप्शन फीड प्रकार",
+       "feed-invalid": "अवैध सबस्क्रिप्शन फीड प्रकार",
        "feed-unavailable": "सिंडिकेशन फीड उपलब्ध नइखें",
        "site-rss-feed": "$1 आरएसएस फीड",
        "site-atom-feed": "$1 एटम फीड",
-       "page-rss-feed": "\"$1\" à¤\86रà¤\8fसà¤\8fस à¤«à¤¿ड",
+       "page-rss-feed": "\"$1\" à¤\86रà¤\8fसà¤\8fस à¤«à¥\80ड",
        "page-atom-feed": "\"$1\" एटम फीड",
-       "red-link-title": "$1 (पन्ना मौजूद नइखे)",
+       "red-link-title": "$1 (पन्ना मौजूद नइखे)",
        "sort-descending": "उतरत क्रम में",
        "sort-ascending": "चढ़त क्रम में",
        "nstab-main": "पन्ना",
        "nstab-category": "श्रेणी",
        "mainpage-nstab": "मुख्य पन्ना",
        "nosuchaction": "अइसन कौनो कार्रवाई नइखे",
-       "nosuchactiontext": "à¤\8f à¤¯à¥\82॰à¤\86र॰à¤\8fल à¤¦à¥\8dवारा à¤¬à¤¤à¤¾à¤µà¤² à¤\95ारà¥\8dरवाà¤\88 à¤\85वà¥\88ध à¤¬à¤¾à¥¤\nरà¤\89वाà¤\81 à¤¯à¥\82॰à¤\86र॰à¤\8fल à¤\97लत à¤²à¤¿à¤\96लà¥\87 à¤¹à¥\8bà¤\96ब, à¤¯à¤¾ à¤\95वà¥\8dनà¥\8b गलत कड़ी के इस्तेमाल कइले होखब।\n{{SITENAME}} में इस्तमाल हो रहल सॉफ्टवेयर में खराबी के लच्छन भी हो सकत बा।",
+       "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 गलत कड़ी के इस्तेमाल कइले होखब।\n{{SITENAME}} में इस्तमाल हो रहल सॉफ्टवेयर में खराबी के लच्छन भी हो सकत बा।",
        "nosuchspecialpage": "अइसन कौनो खास पन्ना नइखे",
        "nospecialpagetext": "<strong>रउआँ एगो अवैध खास पन्ना के अनुरोध कइले बानी।</strong>\n\nबैध खास पन्नासभ के लिस्ट [[Special:SpecialPages|{{int:specialpages}}]] पर देखल जा सकत बा।",
        "error": "खराबी",
        "databaseerror-error": "खराबी: $1",
        "transaction-duration-limit-exceeded": "हाई रिप्लिकेशन लैग बनावे से बचे खातिर ई ट्रांजेक्शन निरस्त कर दिहल गइल, काहें से की राइट करे में लागे वाला समय ($1), $2 के सीमा से अधिक रहल ह।\nअगर आप कई ठो आइटम एकही साथ बदलत होखीं, तब कई टुकड़ा में ई काम करे के कोसिस करीं।",
        "laggedslavemode": "<strong>चेतावनी:</strong> अइसन भी हो सकेला कि पन्ना पर हाल के अपडेट न होखे।",
-       "readonly": "डेटाबेस तालाबंद बा",
+       "readonly": "डेटाबेस तालाबंद बा",
        "enterlockreason": "तालाबंदी के कारण दीं, आ अनुमान बताईं कि कब तालाबंदी हटी",
        "readonlytext": "नया संपादन आ अन्य बदलाव खातिर डाटाबेस पर तालाबंदी बा, शायद रुटीन मेंटेनन्स के चलते, जेकरा बाद ए के सामान्य स्थिती में आ जाये के चाहीं।\n\nतालाबंदी करे वाला सिस्टम प्रबंधक के बतावल कारण: $1",
        "missing-article": "डेटाबास के ओ पन्ना के पाठ ना मिलल जवन मिले के चाहत रहल, एकर नाँव रहल \"$1\" $2।\nआमतौर पर अइसन तब होला पुरान हो चुकल अंतर या हटावल पन्ना के इतिहास के कड़ी के पीछा कइल जा रहल होखे।\n\nयदि ई बात नइखे, तब हो सकेला आपके कौनों सॉफ्टवेयर बग मिल गइल होखे।\n[[Special:ListUsers/sysop|प्रबंधक]] के ई यूआरएल दे के खबर करीं।",
        "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-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पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤\95 à¤\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|पन्ना|पन्नवन}} में समाइल बाटे:",
        "mergehistory-empty": "कौनों अवतरण विलय नइखे कइल जा सकत।",
        "mergehistory-done": " $1 के $3 {{PLURAL:$3|अवतरण|अवतरण सभ}} सफलता से [[:$2]] में विलय भइल।",
        "mergehistory-fail": "इतिहास विलय करे में अक्षम, पन्ना आ एकर टाइम पैरामीटर चेक करीं।",
+       "mergehistory-autocomment": "[[:$1]] के [[:$2]] में विलय कइल गइल",
+       "mergehistory-comment": "[[:$1]] के [[:$2]] में विलय कइल गइल: $3",
+       "mergehistory-same-destination": "स्रोत आ लक्ष्य पन्ना एकही ना होखे सकत बा",
        "mergehistory-reason": "कारण:",
+       "mergelog": "विलय लॉग",
        "revertmerge": "अलग करीं",
        "mergelogpagetext": "एक पन्ना इतिहास के दुसर पन्ना इतिहास में तुरंत विलय भइले के एगो सूची नीचे दिहल बा।",
        "history-title": "''$1'' के संशोधन इतिहास",
        "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": "धियानसूची में डालीं",
        "logentry-newusers-create": "खाता $1 {{GENDER:$2|बनावल गइल}}",
        "revdelete-summary": "सारांश संपादन",
        "searchsuggest-search": "खोजीं",
-       "api-error-nomodule": "भितरी खराबी:कउनो अपलोड मॉड्युल सेट नइखे",
        "expandtemplates": "टेम्पलेट बिस्तार",
        "mediastatistics": "मीडिया सांख्यिकी"
 }
index 6d103c0..a25c258 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": "স্থায়ী সংযোগ",
        "passwordremindertext": "কেউ একজন ($1 আইপি ঠিকানাটি থেকে সম্ভবত আপনি) অনুরোধ করেছেন যেন আমরা আপনাকে {{SITENAME}} ($4) এর জন্য একটি নতুন পাসওয়ার্ড পাঠাই।\n\"$2\" নামে অ্যাকাউন্ট খোলা হয়েছে এবং এর পাসওয়ার্ড \"$3\"। আপনি যদি এটাই চেয়ে থাকেন, তাহলে আপনাকে এখন অ্যাকাউন্টে প্রবেশ করতে হবে ও নতুন একটি পাসওয়ার্ড পছন্দ করতে হবে।\n{{PLURAL:$5|এক দিন|$5 দিন}} পরে আপনার এই অস্থায়ী পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়ে যাবে।\n\nযদি আপনি ছাড়া অন্য কেউ এই অনুরোধ করে থাকে, কিংবা যদি আপনার পুরনো পাসওয়ার্ড মনে পড়ে গিয়ে থাকে ও সেটি আর বদলাবার ইচ্ছা না থাকে, তাহলে এই বার্তাটি উপেক্ষা করতে পারেন এবং পুরনো পাসওয়ার্ডটিই ব্যবহার করে যেতে পারেন।",
        "noemail": "\"$1\" ব্যবহারকারীর জন্য কোন ই-মেইল ঠিকানা সংরক্ষিত নেই।",
        "noemailcreate": "আপনাকে অবশ্যই একটি সঠিক ইমেইল ঠিকানা দিতে হবে",
-       "passwordsent": "একটি নতুন পাসওয়ার্ড \"$1\" ব্যবহারকারীর ই-মেইল ঠিকানায় পাঠানো হয়েছে। দয়াকরে তা পাওয়ার পর আবার লগ-ইন করুন।",
+       "passwordsent": "একটি নতুন পাসওয়ার্ড \"$1\" ব্যবহারকারীর ই-মেইল ঠিকানায় পাঠানো হয়েছে। দয়া করে তা পাওয়ার পর আবার প্রবেশ করুন।",
        "blocked-mailpassword": "আপনার আইপি ঠিকানাটি থেকে সম্পাদনা করতে বাধা আছে। অপব্যবহার রোধ করার জন্য, এই আইপি ঠিকানা থেকে পাসওয়ার্ড পুনরুদ্ধার করার অনুমতি দেয়া হয়নি।",
        "eauthentsent": "মনোনীত ই-মেইল ঠিকানায় একটি নিশ্চিতকরণ ই-মেইল পাঠানো হয়েছে।\nঐ অ্যাকাউন্টটে অন্য কোন ই-মেইল পাঠানোর আগে আপনাকে ই-মেইলের নির্দেশগুলি অনুসরণ করতে হবে, যাতে অ্যাকাউন্টটি যে আসলেই আপনার, তা নিশ্চিত হয়।",
        "throttled-mailpassword": "বিগত {{PLURAL:$1|ঘণ্টার|$1 ঘণ্টার}} মধ্যে ইতিমধ্যেই একবার পাসওয়ার্ড বদলের তথ্য পাঠানো হয়েছে। অপব্যবহার রোধে প্রতি {{PLURAL:$1|ঘণ্টায়|$1 ঘণ্টায়}} কেবল একবার পাসওয়ার্ড বদলের তথ্য পাঠানো যাবে।",
        "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": "এই উইকিতে ইমেইল অপশনটি বন্ধ করা হয়েছে।",
        "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দয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
        "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": "অন্য কারণ",
        "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": "নমুনা",
        "recentchangesdays-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিন|দিন}}",
        "recentchangescount": "সাম্প্রতিক পরিবর্তনে প্রদর্শিত সম্পাদনার সংখ্যা:",
        "prefs-help-recentchangescount": "এতে সাম্প্রতিক পরিবর্তনসমূহ, পাতার ইতিহাস এবং লগ অন্তর্ভুক্ত।",
-       "prefs-help-watchlist-token2": "à¦\8fà¦\9fি à¦\86পনার à¦¨à¦\9cরতালিà¦\95ার à¦\93য়à§\87ব à¦«à¦¿à¦¡à§\87র à¦\97à§\8bপন à¦\9aাবি। à¦¯à§\87 à¦\95à§\87à¦\89 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fা à¦\9cানà§\87ন à¦¤à¦¿à¦¨à¦¿ à¦\86পনার à¦¨à¦\9cরতালিà¦\95া à¦ªà¦¡à¦¼à¦¤à§\87 à¦¸à¦\95à§\8dষম à¦¹à¦¬à§\87ন, à¦¤à¦¾à¦\87 à¦\8fà¦\9fি à¦ªà§\8dরà¦\95াশ à¦\95রবà§\87ন à¦¨à¦¾à¥¤ [[Special:ResetTokens|à¦\86পনার à¦\8fà¦\9fি à¦ªà§\81নরায় à¦¸à§\87à¦\9f করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
+       "prefs-help-watchlist-token2": "à¦\8fà¦\9fি à¦\86পনার à¦¨à¦\9cরতালিà¦\95ার à¦\93য়à§\87ব à¦«à¦¿à¦¡à§\87র à¦\97à§\8bপন à¦\9aাবি। à¦¯à§\87 à¦\95à§\87à¦\89 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fা à¦\9cানà§\87ন à¦¤à¦¿à¦¨à¦¿ à¦\86পনার à¦¨à¦\9cরতালিà¦\95া à¦ªà¦¡à¦¼à¦¤à§\87 à¦¸à¦\95à§\8dষম à¦¹à¦¬à§\87ন, à¦¤à¦¾à¦\87 à¦\8fà¦\9fি à¦ªà§\8dরà¦\95াশ à¦\95রবà§\87ন à¦¨à¦¾à¥¤ [[Special:ResetTokens|à¦\86পনার à¦\8fà¦\9fি à¦ªà§\81নà¦\83নিরà§\8dধারণ করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
        "savedprefs": "আপনার পছন্দগুলো সংরক্ষণ করা হয়েছে।",
        "savedrights": "{{GENDER:$1|$1}}-এর ব্যবহারকারী দল সংরক্ষিত হয়েছে।",
        "timezonelegend": "সময়স্থান:",
        "youremail": "ইমেইল *",
        "username": "{{GENDER:$1|ব্যবহারকারী নাম}}:",
        "prefs-memberingroups": "{{PLURAL:$1|দলের|দলসমূহের}} {{GENDER:$2|সদস্য}}:",
+       "group-membership-link-with-expiry": "$1 ($2 পর্যন্ত)",
        "prefs-registration": "নিবন্ধনের সময়:",
        "yourrealname": "আসল নাম *",
        "yourlanguage": "ভাষা:",
        "editusergroup": "ব্যবহারকারী দল লোড করুন",
        "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|ব্যবহারকারীর}} ব্যবহারকারী অধিকার পরিবর্তন করছেন",
        "viewinguserrights": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|ব্যবহারকারীর}} ব্যবহারকারী অধিকার দেখছেন",
-       "userrights-editusergroup": "ব্যবহারকারীর দল সম্পাদনা করো",
-       "userrights-viewusergroup": "ব্যবহারকারী দল দেখা",
+       "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-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": "ব্যবহারকারী অধিকার দ্বন্দ্ব! অনুগ্রহ করে নিশ্চিত হোন এবং পুনরায় চেষ্টা করুন।",
        "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": "ব্যুরোক্র্যাট",
        "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-highlightbutton-title": "ফলাফল আলোকপাত করুন",
+       "rcfilters-highlightmenu-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",
        "uploadbtn": "ফাইল আপলোড করুন",
        "reuploaddesc": "আপলোড বাতিল করো এবং আপলোড ফর্মে ফেরত যাও।",
        "upload-tryagain": "পরিবর্তিত ফাইল বর্ণনা জমা দিন",
-       "uploadnologin": "à¦\86পনি à¦²à¦\97-à¦\87ন à¦\95রà§\87ননি।",
+       "uploadnologin": "à¦\86পনি à¦ªà§\8dরবà§\87শ à¦\95রà§\87ননি",
        "uploadnologintext": "ফাইল আপলোড করতে হলে আপনাকে অবশ্যই $1 করতে হবে।",
        "upload_directory_missing": "আপলোড ডাইরেক্টরি ($1) পাওয়া যাচ্ছে না এবং ওয়েব সার্ভার কর্তৃক তৈরি করা যাচ্ছে না।",
        "upload_directory_read_only": "আপলোড ডিরেক্টরিটি ($1) ওয়েবসার্ভার কর্তৃক লিখনযোগ্য নয়।",
        "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জাভা ফাইল আপলোডের কোনো অনুমতি নেই, কারণ এই ধরনের ফাইল সিস্টেমে নিরাপত্তা ত্রুটি তৈরী করতে পারে।",
        "apisandbox-results": "ফলাফল",
        "apisandbox-sending-request": "API অনুরোধ পাঠানো হচ্ছে...",
        "apisandbox-loading-results": "API ফলাফল গ্রহণ করা হচ্ছে...",
-       "apisandbox-request-params-json": "JSON প্যারামিটার:",
+       "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": "অব্যাহত",
        "emailccsubject": "আপনার বার্তার অনুলিপি $1-কে: $2",
        "emailsent": "ই-মেইল প্রেরণ করা হয়েছে",
        "emailsenttext": "আপনার ই-মেইল বার্তা প্রেরণ করা হয়েছে।",
-       "emailuserfooter": "এই ইমেইলটি {{SITENAME}} সাইটের \"{{int:emailuser}}\" সুবিধা ব্যবহার করে $1-এর পক্ষ থেকে {{GENDER:$2|$2}}-এর নিকট {{GENDER:$1|পাঠানো হয়েছে}}। {{GENDER:$2|আপনার}} উত্তরের ইমেইলটি সরাসরি {{GENDER:$1|মূল প্রেরকের}} কাছে পাঠানো হবে, সেই সাথে {{GENDER:$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:ব্যবহারকারী বার্তা",
        "editcomment": "সম্পাদনা সারাংশ ছিল: \"''$1''\"।",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]]) এর সম্পাদিত সংস্করণ হতে [[User:$1|$1]] এর সম্পাদিত সর্বশেষ সংস্করণে ফেরত যাওয়া হয়েছে।",
        "revertpage-nouser": "একজন গোপন ব্যবহারকারী কর্তৃক সম্পাদিত সম্পাদনাটি বাতিলপূর্বক {{GENDER:$1|[[User:$1|$1]]}}-এর সর্বশেষ সম্পাদনায় ফেরত যাওয়া হয়েছে।",
-       "rollback-success": "$1-এর সম্পাদনাগুলি পূর্বাবস্থায় ফিরিয়ে নেওয়া হয়েছে; $2-এর করা শেষ সংস্করণে পাতাটি ফেরত নেওয়া হয়েছে।",
+       "rollback-success": "{{GENDER:$3|$1}}-এর সম্পাদনাগুলি পূর্বাবস্থায় ফিরিয়ে নেওয়া হয়েছে; {{GENDER:$4|$2}}-এর করা শেষ সংস্করণে পাতাটি ফেরত নেওয়া হয়েছে।",
        "rollback-success-notify": "$1-এর সম্পাদনাগুলি বাতিল করা হয়েছে; \n$2-এর করা শেষ সংস্করণে ফেরত নেওয়া হয়েছে। [$3 পরিবর্তন দেখুন]",
        "sessionfailure-title": "সেশন পরিত্যক্ত",
        "sessionfailure": "আপনার প্রবেশ সেশনে একটি সমস্যা হয়েছে বলে মনে হচ্ছে;\nসেশন হাইজ্যাক প্রতিরোধের উপায় হিসেবে এই কাজটি বাতিল করা হয়েছে।\nঅনুগ্রহ ব্রাউজারের \"পিছনে\" বোতাম চাপুন এবং যে পাতা থেকে এসেছিলেন, তা পুনঃলোড করুন এবং আবার চেষ্টা করুন।",
        "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-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": "পূর্বাবস্থায় ফেরত নেওয়া হোক",
        "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-এর অস্তিত্ব নেই।",
        "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-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": "অভ্যন্তরীণ ত্রুটি: এই অনুরোধের জন্য এইচটিটিপি পোস্ট প্রয়োজন।",
-       "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-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": "কুকি-ভিত্তিক সেশন",
        "usercssispublic": "অনুগ্রহ করে লক্ষ্য করুন: সিএসএসের উপপাতাগুলিতে গোপনীয় তথ্য থাকা উচিত নয় যেহেতু অন্যান্য ব্যবহারকারীও এগুলি দেখতে পান।",
        "restrictionsfield-badip": "আইপি ঠিকানা অথবা পরিসীমা অবৈধ: $1",
        "restrictionsfield-label": "অনুমোদিত আইপি পরিসীমা:",
-       "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে<br><code>0.0.0.0/0</code><br><code>::/0</code><br>ব্যবহার করুন",
+       "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে ব্যবহার করুন: :<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "সংশোধন $1",
        "pageid": "পাতার আইডি $1"
 }
index cf50e95..7b6c458 100644 (file)
        "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": "چاپ گرهڌن",
        "create-local": "یأ توزی ڤولات نشيني إزافإ کونين",
        "editthispage": "اصلاح ای صفحه",
        "delete": "حذف",
+       "deletethispage": "اي بلگأ نأ پاکسا کونين",
+       "undeletethispage": "اي بلگأ نأ پاکسا نکونين",
        "protect": "حفاظت وحمایت",
        "protect_change": "آلإشت کونين",
+       "protectthispage": "ز اي بلگأ هامينداري کونين",
        "newpage": "صفحه تازه",
        "talkpage": "بحث ای صفحه",
        "talkpagelinktext": "چأک چئنە",
        "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?",
        "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": "نوم کاریاريتونأ بزنين",
        "createacct-yourpasswordagain": "پشت راسدکاري رازينإ گوڤأرتن",
        "createacct-yourpasswordagain-ph": "ز نۉ رازينإ گوڤأرتن نأ بزأ",
        "userlogin-remembermypassword": "مۈنإ مإن سامۈنإ ڤاڌار",
+       "yourdomainname": "پوشگر ايسا:",
        "login": "اویدن به سیستم",
        "nav-login-createaccount": "اویدن به سیستم",
        "userlogin": "اویدن به سیستم / درست کردن حساب کاربری",
        "gotaccountlink": "اویدن به",
        "userlogin-resetpassword-link": "رازینإ گوڤأرتن تۈ ز ڤيرتۈن رأهڌإ",
        "userlogin-helplink2": "هومياري کردن سي ڤامإن أڤوڌن",
+       "createacct-emailrequired": "تيرنشۈن أنجومانامأ",
        "createacct-emailoptional": "تيرنشۈن أنجومانامأ",
        "createacct-email-ph": "تيرنشۈن أنجومانامأ تۈنأ بزنين",
+       "createacct-another-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|هوميار|هوميارا}}",
        "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": "یه ایمیل سی تایید آدرس ایمیل به آدرس مورنظر ارسال وابید. قبل زه یو که ایمیل دیگری قابل ارسال به این آدرس بوه، وا دستورهایی که در آن ایمیل اویده را جهت تأیید ای مساله که ای آدرس مال ایسانه اجرا کنین.",
+       "emaildisabled": "اي ديارگأ نترإ إنجومانامإ سيتۈن بفرشنإ",
+       "accountcreated": "هساڤ راسد ڤابي",
+       "createaccount-title": "هساڤ سي {{SITENAME}} راسد ڤابي",
        "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": "تيرنشۈن أنجومانامأ",
+       "passwordreset-emailtitle": "جوزيات هساڤ مإن{{SITENAME}}",
+       "passwordreset-invalidemail": "تيرنشۈن أنجومانامأ نادوروسد",
+       "changeemail-oldemail": "تيرنشۈن أنجومانامإ ايسني",
+       "changeemail-newemail": "تيرنشۈن أنجومانامإ تازأ:",
+       "changeemail-none": "(هيش كوم)",
+       "changeemail-password": "رازينإ گوڤأرتن {{SITENAME}} ایسا:",
+       "changeemail-submit": "آلشد کردن أنجومانامأ",
+       "resettokens": "ز نۉ کردن نشۈنإیل",
+       "resettokens-tokens": "نشۈنإیل:",
+       "resettokens-token-label": "$1 (أرزایشت تازأ: $2)",
        "bold_sample": "متن گپ نما",
        "bold_tip": "متن گپ نما",
        "italic_sample": "متن شکسته",
        "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": "ايسا ز دين یأ هومپیڤأندي هڌين کإ نيڌس. سي رأڤأندياري بألگإ شورۈ کونين مإن اي جأڤإ دإڤۈني بنڤيسين(سي دونسدن بیشدر سإیل [$1]کونین).\nأر ايسا سي إشتڤاکاري ايچونين، دوگمإ رأهڌن ڤاپوشد نأ بپۈرنين.",
        "noarticletext": " ايسإ اي بألگإ نإڤشدإیي نارإ، ايسا تإرين [[Special:Search/{{PAGENAME}}داسۈن اي بألگإ نإ مإن بألگإآ ديأري پی جۈري کونين]] یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اي بألگإ نأ ڤيرایشد کونين].",
        "editing": "درحال اصلاح $1",
        "creating": "راسد کردن $1",
        "editingsection": "درحال اصلاح $1 (قسمت)",
+       "yourtext": "متن ايسا",
        "copyrightwarning": "لطفاً دقت کنین که درنظر گریده ابوه که همه شراکتهای ایسا  {{SITENAME}} تحت «$2» منتشر ابون ).\n\n\n(سی دیدن  جزئیات بیشتر به $1 برین\n\nایر نه خوین نوشته‌هاتو بی‌رحمانه اصلاح بوه و به دلخواه ارسال بوه، ایچو نفرستن.<br />\nدرضمن ایسادارین به ایما قول ادین که خودتو یونه نوشتین یا هونه زه یک منبع آزاد با مالکیت عمومی یا مثل هو ورداشتین. '''کارهای دارای کارهای دارای حق کپی رایت را بی‌اجازه نفرستین!'''',",
        "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",
        "nextrevision": "نسخه بعدی →",
        "currentrevisionlink": "نسخه جاری",
        "cur": "فعلی",
+       "next": "نيایي",
        "last": "قبلی",
        "page_first": "اولین",
        "page_last": "آخری",
        "histlegend": "انتخاب متفاوت: علامت بنین رو رادیو جعبه ها زه آن نسخه ها سی مقایسه وامتیاز دادن ویا داخل تکمه های زیر سی مسابقه بوین  .<br />\n'شرح: (فعلی) = تفاوت با نسخه جاری\n(قبلی) = تفاوت با نسخه قبلی، جز = ویرایش جزئی',",
-       "histfirst": "کهنه ترین",
-       "histlast": "تازه ترین",
+       "histfirst": "دينداتري",
+       "histlast": "تازإترين",
+       "historyempty": "(هالي)",
        "history-feed-item-nocomment": "$1 در $2",
        "rev-delundel": "آلشد هال و بال ديإن",
+       "rev-showdeleted": "دياري کردن",
+       "revdelete-show-file-submit": "هأرإ",
+       "revdelete-log": "دلیل:",
+       "mergehistory-from": "بألگإ سرچشمأ:",
+       "mergehistory-reason": "دلیل:",
        "history-title": "دڤارتإ دیئن ڤيرگار $1",
        "difference-title": "فرخ مإنجقا ڤانإیريا \"$1\"",
        "lineno": "سطر $1:",
        "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-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",
        "undeletebtn": "بازیافت",
        "namespace": "فضای نام:",
        "invert": "انتخاب برعکس بوه",
+       "tooltip-invert": "ز ري اي جأڤأ بپۈرنين و آلشدایي نأ کإ مإنجقا نوم ڤأرگأ إنتخاڤ ڤابيڌن أنجوم داڌإ ڤابيڌنإ قام کونين.",
        "namespace_association": "نوم جایل یأکاگرهڌأ",
+       "tooltip-namespace_association": "اي جأڤإ نأ ڤارسي کونين اي جأڤأ د ڤأرگرهڌإ چأک چنإ آ داسۈن نوم ڤأرگأ شريکي و نوم ڤأرگأ گولإڤورچينإ.",
        "blanknamespace": "(اصلی)",
        "contributions": "{{GENDER:$1|کاریار}} هومیاریا",
        "mycontris": "هومياریا",
        "tooltip-upload": "شروع آپلود",
        "tooltip-rollback": "\"اعاده\" برگرداندن به وضع اولیه سی ای صفحه که بخاطر مشارکت  آخر اصلاح وابیده بایک کلیک",
        "tooltip-summary": "یأ چکسدأ کۈچير ڤارڌ کونين",
+       "simpleantispam-label": "Anti-spam check.\nپور<strong>نکنين</strong> ايچو نأ!",
        "pageinfo-toolboxlink": "دونسمندیا بلگه",
        "previousdiff": "← اصلاح قدیمی",
        "nextdiff": "تفاوت بعدی→",
        "exif-software": "نرم افزار ب کارگرهڌني",
        "exif-exifversion": "نوسقإ Exif",
        "exif-colorspace": "رنگ ڤأرگأ",
+       "exif-datetimeoriginal": "گات و ڤخت راسد ڤابيإن دۈنسمنديا",
        "exif-datetimedigitized": "گات و وخت دیجیتالی کردن",
        "exif-orientation-1": "عادي",
        "namespacesall": "همه",
index 3ca7f21..a47a9e4 100644 (file)
@@ -17,7 +17,8 @@
                        "아라",
                        "Pymouss",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Trizek (WMF)"
                ]
        },
        "tog-underline": "Liammoù islinennet",
        "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-enotifwatchlistpages": "Kas ur postel din pa vez kemmet ur bajenn zo war ma roll evezhiañ",
        "tog-enotifusertalkpages": "Kas ur postel din pa vez kemmet ma fajenn gaozeal",
-       "tog-enotifminoredits": "Kas ur postel din, ha pa vije evit kemenn kemmoù dister",
+       "tog-enotifminoredits": "Kas ur postel din, ha pa vije evit kemenn kemmoù dister war pajennoù pe restroù",
        "tog-enotifrevealaddr": "Lakaat ma chomlec'h postel war wel er posteloù kemenn-diwall",
        "tog-shownumberswatching": "Diskouez an niver a lennerien",
-       "tog-oldsig": "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",
        "tagline": "Eus {{SITENAME}}",
        "help": "Skoazell",
        "search": "Klask",
+       "search-ignored-headings": " #<!-- lezel al linenn-mañ tre evel m'emañ --> <pre>\n# Titloù a vo lezet a-gostez gant ar c'hlask.\n# Ar c'hemmoù graet amañ a vo lakaet e pleustr kerkent ha menegeret ar bajenn gant an titl.\n# Gallout a rit forsiñ un advenegeriñ ma rit ur c'hemm goullo en ur bajenn.\n# Setu penaos emañ an ereadur :\n#   * Kement linenn zo, adalek an arouezenn \"#\" betek dibenn al linenn a zo un evezhiadenn.\n#   * Kement linenn ha n'eo ket goullo a verk an titl rik a zo da vezañ lezet a-gostez, pennlizherennoù hag all.\nDaveennoù\nLiammoù diavaez\nGwelet ivez\n #</pre> <!-- lezel al linenn-mañ tre evel m'emañ -->",
        "searchbutton": "Klask",
        "go": "Kas",
        "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",
        "ok": "Mat eo",
        "retrievedfrom": "Adtapet diwar « $1 »",
        "youhavenewmessages": "$1 zo ganeoc'h ($2).",
-       "youhavenewmessagesfromusers": "$1 ho peus eus {{PLURAL:$3|un implijer all|$3 implijer}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Bez' hoc'h eus}} $1 a-berzh {{PLURAL:$3|un implijer all|$3 implijer}} ($2).",
        "youhavenewmessagesmanyusers": " $1 ho peus implijerien a-leizh  ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|ur gemennad nevez|999=kemennadoù nevez}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|kemennad diwezhañ|999=kemennadoù diwezhañ}}",
-       "youhavenewmessagesmulti": "Kemennoù nevez zo ganeoc'h war $1",
+       "newmessageslinkplural": "{{PLURAL:$1|ur gemennadenn nevez|999=kemennadennoù nevez}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|kemm diwezhañ|999=kemmoù diwezhañ}}",
+       "youhavenewmessagesmulti": "Kemennadennoù nevez zo ganeoc'h war $1",
        "editsection": "kemmañ",
        "editold": "kemmañ",
        "viewsourceold": "sellet ouzh tarzh an destenn",
        "databaseerror-query": "Reked : $1",
        "databaseerror-function": "Arc'hwel : $1",
        "databaseerror-error": "Fazi : $1",
+       "transaction-duration-limit-exceeded": "Kuit da lakaat kreskiñ betek re an termen respont eo bet nullet an treuzgread-mañ rak aet e oa ar pad skrivañ ($1) en tu all d'ar vevenn a $2 eilenn.\nM'emaoc'h o cheñch kalz elfennoù war un dro klaskit kentoc'h troc'hañ anezho e meur a oberiadenn disteroc'h.",
        "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)",
        "readonly_lag": "Stanket eo bet ar bank roadennoù ent emgefre p'emañ an eilservijerioù oc'h adpakañ o dale e-keñver ar pennservijer",
+       "nonwrite-api-promise-error": "Kaset e oa bet an talbenn HTTP 'Promise-Non-Write-API-Action' met savet e oa bet ar reked ouzh ur vodulenn skrivañ API.",
        "internalerror": "Fazi diabarzh",
        "internalerror_info": "Fazi diabarzh : $1",
+       "internalerror-fatal-exception": "Fazi groñs a seurt \"$1\"",
        "filecopyerror": "Dibosupl eilañ \"$1\" war-du \"$2\".",
        "filerenameerror": "Dibosupl da adenvel « $1 » e « $2 ».",
        "filedeleteerror": "Dibosupl eo diverkañ « $1 ».",
        "cannotdelete": "Dibosupl diverkañ ar bajenn pe ar restr \"$1\".\nMarteze e o bet diverket gant unan bennak all dija.",
        "cannotdelete-title": "N'haller ket diverkañ ar bajenn \"$1\"",
        "delete-hook-aborted": "Nullet ar c'hemmañ gant un astenn.\nAbeg dianav.",
+       "no-null-revision": "N'eus ket bet gallet krouiñ un adweladenn nevez c'houllo evit ar bajenn \"$1\"",
        "badtitle": "Titl fall",
        "badtitletext": "Faziek pe c'houllo eo titl ar bajenn goulennet; pe neuze eo faziek al liamm etreyezhel pe etrewiki.\nMarteze ez eus ennañ arouezennoù n'haller ket degemer en titloù.",
+       "title-invalid-empty": "Pe eo goullo titl ar bajenn c'houlennet pe n'eus ennañ nemet anv an esaouenn anv.",
+       "title-invalid-utf8": "Titl ar bajenn c'houlennet zo ennañ un heuliad UTF-8 direizh.",
+       "title-invalid-interwiki": "Titl ar bajenn c'houlennet zo ennañ ul liamm etrewiki n'haller ket ober gantañ en titloù.",
+       "title-invalid-talk-namespace": "Titl ar bajenn c'houlennet a ra dave d'ur bajenn gaozeal n'eus ket anezhi.",
+       "title-invalid-characters": "Titl ar bajenn c'houlennet zo ennañ arouezennoù direizh : \"$1\".",
+       "title-invalid-relative": "Un hent amvat zo gant an titl. Direizh eo titloù ar pajennoù amvat (./, ../) peogwir e vint dibosupl da dizhout dre merdeerioù implijet gant tud zo.",
+       "title-invalid-magic-tilde": "Titl ar bajenn c'houlennet zo ennañ un heuliad tildennoù burzhudus direizh (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Re hir eo titl ar bajenn c'houlennet. N'hall ket bezañ hiroc'h eget $1 {{PLURAL:$1|okted}} er c'hod UTF-8.",
+       "title-invalid-leading-colon": "Titl ar bajenn c'houlennet zo ennañ un daoubik direizh er penn-kentañ.",
        "perfcached": "Krubuilhet eo ar roadennoù da-heul ha marteze n'int ket bet hizivaet. D'ar muiañ e c'haller kaout {{PLURAL:$1|un disoc'h|$1 disoc'h}} er grubuilh.",
        "perfcachedts": "Krubuilhet eo ar roadennoù da-heul hag hizivaet int bet da ziwezhañ d'an $1. D'ar muiañ e c'haller kaout {{PLURAL:$4|un disoc'h|$4 disoc'h}} er grubuilh.",
        "querypage-no-updates": "Diweredekaet eo an hizivaat evit ar bajenn-mañ. Evit poent ne vo ket nevesaet ar roadennoù amañ.",
        "viewsource": "Sellet ouzh tarzh an destenn",
        "viewsource-title": "Gwelet an tarzh evit $1",
        "actionthrottled": "Ober daleet",
-       "actionthrottledtext": "A-benn dizarbenn ar strob, n'haller ket implijout an ober-mañ re alies en ur frapad amzer lakaet, hag aet oc'h dreist ar muzul. Klaskit en-dro a-benn un nebeut munutennoù.",
+       "actionthrottledtext": "A-benn dizarbenn ar strob, n'haller ket implijout an ober-mañ re alies en ur frapad amzer lakaet, hag aet oc'h dreist ar muzul. Klaskit en-dro a-benn un nebeudig munutennoù.",
        "protectedpagetext": "Prennet eo bet ar bajenn-mañ kuit na vefe skrivet pe cheñchet un dra bennak enni",
-       "viewsourcetext": "Gallout a rit gwelet hag eilañ danvez ar bajenn-mañ",
-       "viewyourtext": "Gallout a rit gwelet hag eilañ mammenn ho '''kemmoù''' d'ar bajenn-mañ :",
+       "viewsourcetext": "Gallout a rit gwelet hag eilañ mammenn ar bajenn-mañ.",
+       "viewyourtext": "Gallout a rit gwelet hag eilañ mammenn ho <strong>kemmoù</strong> d'ar bajenn-mañ.",
        "protectedinterface": "Testenn ar bajenn-mañ a dalvez evit etrefas ar meziant er wiki-mañ. Setu perak eo bet gwarezet ar bajenn.",
        "editinginterface": "'''Diwallit :''' Emaoc'h o kempenn ur bajenn a dalvez da sevel skridoù evit etrefas ar meziant. Ar c'hemmoù graet d'ar bajenn-mañ a cheñcho etrefas an holl implijerien. Mar fell deoc'h skoazellañ evit treiñ traoù, soñjit kentoc'h implijout [https://translatewiki.net/wiki/Main_Page?setlang=br translatewiki.net], ar raktres evit lec'helaat MediaWiki.",
-       "cascadeprotected": "Gwarezet eo ar bajenn-mañ; n'haller ket kemmañ anezhi ken p'he c'haver {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :\n$2",
+       "translateinterface": "Evit ouzhpennañ pe cheñch troidigezhioù en holl wikioù, grit gant [https://translatewiki.net/ translatewiki.net], anezhañ raktres lec'helaat MediaWiki.",
+       "cascadeprotected": "Gwarezet eo ar bajenn-mañ ; n'haller ket kemmañ anezhi ken p'he c'haver treuzkludet {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :\n$2",
        "namespaceprotected": "N'oc'h ket aotreet da gemmañ pajennoù an esaouenn anv '''$1'''.",
        "customcssprotected": "N'oc'h ket aotreet da gemmañ ar bajenn CSS-mañ rak kavout a reer enni arventennoù personel un implijer all.",
        "customjsprotected": "N'oc'h ket aotreet da gemmañ ar bajenn JavaScript-mañ rak kavout a reer enni arventennoù personel un implijer all.",
        "mypreferencesprotected": "N'ho peus ket ar gwirioù evit kemmañ ho Penndibaboù.",
        "ns-specialprotected": "N'haller ket kemmañ ar pajennoù en esaouenn anv {{ns:special}}.",
        "titleprotected": "Gwarezet eo bet an titl-mañ p'eo bet krouet gant [[User:$1|$1]].\nSetu amañ perak <em>$2</em>.",
-       "filereadonlyerror": "Dibosupl kemmañ ar restr \"$1\" abalamour m'emañ ar c'havlec'h restroù \"$2\" e mod lenn nemetken.\n\n\"''$3''\" eo an abeg roet gant ar merour en deus prennet anezhi.",
+       "filereadonlyerror": "Dibosupl kemmañ ar restr \"$1\" abalamour m'emañ ar c'havlec'h restroù \"$2\" e mod lenn nemetken.\n\n\"$3\" eo an abeg roet gant merour ar reizhiad en deus prennet anezhi.",
        "invalidtitle-knownnamespace": "Titl direizh gant an esaouenn anv \"$2\" hag an destenn \"$3\"",
        "invalidtitle-unknownnamespace": "Titl direizh gant an niverenn esaouenn anv $1 hag an destenn \"$2\" dianav",
        "exception-nologin": "N'oc'h ket kevreet",
        "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-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)",
        "wrongpassword": "Ger-tremen kamm. Klaskit en-dro.",
        "wrongpasswordempty": "Ger-tremen ebet. Lakait unan mar plij.",
        "passwordtooshort": "{{PLURAL:$1|1 arouezenn|$1 arouezenn}} hir a rank bezañ ar gerioù-tremen da nebeutañ.",
-       "passwordtoolong": "N'hall ket ar gerioù-tremen bezañ enno ouzhpenn $1 arouezenn.",
+       "passwordtoolong": "N'hall ket ar gerioù-tremen bezañ enno ouzhpenn $1 {{PLURAL:$1|1 arouezenn|$1 arouezenn}}.",
+       "passwordtoopopular": "N'haller ket ober gant gerioù-ter boutin betek re. Grit gant ur ger-tremen raloc'h.",
        "password-name-match": "Rankout a ra ho ker-tremen bezañ disheñvel diouzh hoc'h anv implijer.",
        "password-login-forbidden": "Berzet eo ober gant an anv implijer hag ar ger-tremen-mañ.",
        "mailmypassword": "Adderaouekaat ar ger-tremen",
        "noemail": "N'eus bet enrollet chomlec'h postel ebet evit an implijer \"$1\".",
        "noemailcreate": "Ret eo deoc'h merkañ ur chomlec'h postel reizh",
        "passwordsent": "Kaset ez eus bet ur ger-tremen nevez da chomlec'h postel an implijer \"$1\".\nTrugarez deoc'h da gevreañ kerkent ha ma vo bet resevet ganeoc'h.",
-       "blocked-mailpassword": "N'haller ket kemmañ pajennoù gant ar chomlec'h IP-mañ ken rak stanket eo bet. Gant se n'hallit ket implijout an arc'hwel adtapout gerioù-tremen, kuit m'en em ledfe gwallimplijoù.",
+       "blocked-mailpassword": "N'haller ket kemmañ pajennoù gant ar chomlec'h IP-mañ ken rak stanket eo bet. Kuit m'en em ledfe gwallimplijoù n'hallit ket implijout an arc'hwel adtapout gerioù-tremen adalek ar chomlec'h IP-mañ.",
        "eauthentsent": "Kaset ez eus bet ur postel kadarnaat war-du ar chomlec'h postel spisaet.\nA-raok na vije kaset postel ebet d'ar gont-se e vo ret deoc'h heuliañ ar c'huzulioù merket er postel resevet evit kadarnaat ez eo mat ho kont deoc'h.",
        "throttled-mailpassword": "Kaset ez eus bet deoc'h ur postel adderaouekaat e-kerzh an\n{{PLURAL:$1|eurvezh|$1 eurvezh}} tremenet. Evit mirout ouzh nep gaou ne gaser ket ouzhpenn ur postel a seurt-se bep {{PLURAL:$1|eurvezh|$1 eurvezh}}.",
        "mailerror": "Fazi en ur gas ar postel : $1",
-       "acct_creation_throttle_hit": "{{PLURAL:$1|1 gont|$1 kont}} zo bet krouet c'hoazh nevez zo dre ho chomlec'h IP gant gweladennerien d'ar wiki-mañ, ar pezh zo an niver brasañ aotreet. Dre se, n'hall ket ket ar weladennerien a implij an IP-mañ krouiñ kontoù mui evit ar mare.",
+       "acct_creation_throttle_hit": "Gweladennerien zo o deus implijet ho chomlec'h IP evit krouiñ {{PLURAL:$1|1 gont|$1 kont}} e-kerzh an $2 diwezhañ, ar pezh zo an niver brasañ aotreet. Dre se, n'hall ket ket ar weladennerien a implij an IP-mañ krouiñ kontoù mui evit ar mare.",
        "emailauthenticated": "Gwiriet eo bet ho chomlec'h postel d'an $2 da $3.",
        "emailnotauthenticated": "N'eo ket bet gwiriekaet ho chomlec'h postel evit c'hoazh.\nNe vo ket tu da gas postel ebet deoc'h evit hini ebet eus an dezverkoù dindan.",
        "noemailprefs": "Merkit ur chomlec'h postel mar fell deoc'h ez afe an arc'hwelioù-mañ en-dro.",
        "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.",
        "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-help-grants": "Gant an aotreoù e c'haller kaout ar gwirioù grataet d'ho kont implijer. N'eo ket peogwir e vo gweredekaet un aotre amañ e vo digoret gwirioù ouzhpenn deoc'h estreget ar re zo stag ouzh ho kont implijer. Kit da welet [[Special:ListGrants|taolenn an aotreoù]] evit gouzout hiroc'h.",
        "botpasswords-label-grants-column": "Aotreet",
        "botpasswords-bad-appid": "N'eo ket reizh anv ar robot « $1 »",
        "botpasswords-insert-failed": "C'hwitet eo ouzhpennadenn ar robot « $1 ». Hag ouzhpennet eo bet ?",
        "botpasswords-update-failed": "C'hwitet eo bet hizivadur anv ar robot « $1 ». Ha dilamet eo bet ?",
        "botpasswords-created-title": "Ger-tremen robotoù krouet",
-       "botpasswords-created-body": "Krouet mat eo bet ar ger-tremen « $1 ».",
+       "botpasswords-created-body": "Krouet eo bet ger-tremen ar robot \"$1\" evit an implijer \"$2\".",
        "botpasswords-updated-title": "Ger-tremen robotoù hizivaet",
-       "botpasswords-updated-body": "Hizivaet mat eo bet ar ger-tremen « $1 ».",
+       "botpasswords-updated-body": "Hizivaet mat eo bet ger-tremen ar robot \"$1\" evit an implijer \"$2\".",
        "botpasswords-deleted-title": "Ger-tremen robotoù dilamet",
-       "botpasswords-deleted-body": "Ar ger-tremen robotoù « $1 » zo bet dilamet.",
-       "botpasswords-newpassword": "<strong>\"$2\"</strong> eo ar ger-tremen evit kevreañ gant <strong>$1</strong>. Enrollit anezhañ, par plij, evit ober dave dezhañ diwezhatoc'h.</em>",
+       "botpasswords-deleted-body": "Dilamet eo bet ger-tremen ar robot \"$1\" evit an implijer \"$2\".",
+       "botpasswords-newpassword": "<strong>\"$2\"</strong> eo ar ger-tremen nevez evit kevreañ ouzh <strong>$1</strong>. Enrollit anezhañ evit ober dave dezhañ diwezhatoc'h.</em>(Evit ar robotoù kozh zo rekis evito e vefe heñvel an anv kevreañ ouzh hini an implijer a c'hall bezañ, e c'hallit ober gant <strong>$3</strong> da anv implijer ha gant <strong>$4</strong> evel ger-tremen).",
        "botpasswords-no-provider": "N'eo ket hegerz BotPasswordsSessionProvider.",
+       "botpasswords-restriction-failed": "N'hallit ket kevreañ abalamour d'ar strishadurioù war gerioù-tremen ar robotoù.",
+       "botpasswords-invalid-name": "N'eus ket a zispartier gerioù-tremen robot en anv implijer spisaet (\"$1\").",
+       "botpasswords-not-exist": "N'eus ger-tremen bot ebet anvet \"$2\" gant an implijer \"$1\".",
        "resetpass_forbidden": "N'haller ket cheñch ar gerioù-termen",
+       "resetpass_forbidden-reason": "N'haller ket cheñch ar gerioù-termen : $1",
        "resetpass-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 :",
        "resetpass-abort-generic": "Nullet eo bet kemm ar ger-tremen gant un astenn.",
        "resetpass-expired": "Deuet eo ho ker-tremen d'e dermen. Lakait ur ger-tremen nevez, mar plij, evit kevreañ.",
+       "resetpass-expired-soft": "Aet eo ho ker-tremen d'e dermen, ret eo adderaouekaat anezhañ. Dibabit ur ger-tremen nevez diouzhtu pe klikit war \"{{int:authprovider-resetpass-skip-label}}\" evit ober war-dro diwezhatoc'h.",
+       "resetpass-validity-soft": "Direizh eo ho ker-tremen : $1\n\nDibabit ur ger-tremen nevez diouzhtu, pe klikit war \"{{int:authprovider-resetpass-skip-label}}\" evit ober war-dro diwezhatoc'h.",
        "passwordreset": "Adderaouekaat ar ger-tremen",
        "passwordreset-text-one": "Leugnit ar furmskrid-mañ evit adderaouekaat ho ker-tremen.",
        "passwordreset-text-many": "{{PLURAL:$1|Leugnit unan eus ar maeziennoù da adderaouekaat ho ker-tremen.}}",
        "passwordreset-emailtext-ip": "Unan bennak (c'hwi moarvat gant ar chomlec'h IP $1) en deus goulennet ma vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :\n\n$2\n\nMont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.\nMat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
        "passwordreset-emailtext-user": "Goulennet en deus an implijer $1 war  {{SITENAME}} e vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :\n\n$2\n\nMont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.\nMat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
        "passwordreset-emailelement": "Anv implijer :           \n$1\n\nGer-tremen da c'hortoz : \n$2",
-       "passwordreset-emailsentemail": "Kaset ez eus bet ur postel deoc'h da adderaouekaat ho ker-tremen.",
+       "passwordreset-emailsentemail": "Mard eo liammet ar chomlec'h postel-mañ ouzh ho kont, neuze e vo kaset ur postel deoc'h da adderaouekaat ho ker-tremen.",
+       "passwordreset-emailsentusername": "Mard eo liammet ar chomlec'h postel-mañ gant an anv implijer-mañ, neuze e vo kaset ur postel deoc'h da adderaouekaat ho ker-tremen.",
+       "passwordreset-nocaller": "Ret eo merkañ anv ur galver",
+       "passwordreset-nosuchcaller": "N'eus ket eus ar galver : $1",
+       "passwordreset-ignored": "N'eus ket bet gallet adderaouekaat ar ger-termen. Marteze a-walc'h peogwir n'eus ket bet kefluniet pourvezer ebet ?",
        "passwordreset-invalidemail": "Chomlec'h postel direizh",
-       "changeemail": "Kemmañ ar chomlec'h postel",
-       "changeemail-header": "Kemmañ chomlec'h postel ar gont",
+       "passwordreset-nodata": "N'eus bet lakaet anv implijer na chomlec'h postel ebet",
+       "changeemail": "Kemmañ pe dilemel ar chomlec'h postel",
+       "changeemail-header": "Leuniit ar furmskrid-mañ evit cheñch ho chomlec'h postel. Mar fell deoc'h distagañ ur chomlec'h postel bennak diouzh ho kont, lezit goullo lec'h ar chomlec'h postel nevez a-raok kadarnaat ar furmskrid.",
        "changeemail-no-info": "Ret eo deoc'h bezañ kevreet a-benn mont d'ar bajenn-se war-eeun.",
        "changeemail-oldemail": "Chomlec'h postel a-vremañ :",
        "changeemail-newemail": "Chomlec'h postel nevez :",
+       "changeemail-newemail-help": "Goullo e tlefe chom ar vaezienn-mañ mar fell deoc'h lemel kuit ho chomlec'h postel. Ne viot ket gouest da adderaouekaat ur ger-tremen ankouaet ganeoc'h ken ha ne resevot postel ebet a-berzh ar wiki-mañ ma lamit kuit ar chomlec'h postel.",
        "changeemail-none": "(hini ebet)",
        "changeemail-password": "Ho ker-tremen war {{SITENAME}}:",
        "changeemail-submit": "Cheñch chomlec'h postel",
        "changeemail-throttled": "Betek re hoc'h heus klasket kevreañ en aner.\nGortozit $1, mar plij, a-raok esaeañ en-dro.",
+       "changeemail-nochange": "Merkit ur chomlec'h postel all.",
        "resettokens": "Adderaouekaat ar jedoueroù",
+       "resettokens-text": "Gallout a ri adderaouekaat amañ ar jedoueroù a aotre ac'hanoc'h da vont war roadennoù prevez zo hag a zo staget ouzh ho kont.\n\nMat e vefe deoc'h en ober m'hoc'h eus rannet anezho gant unan bennak dre fazi pe mard eo bet implijet ho kont gant unan bennak all mod pe vod.",
        "resettokens-no-tokens": "N'eus jedouer ebet da adderaouekaat.",
        "resettokens-tokens": "Jedoueroù :",
        "resettokens-token-label": "$1 (talvoud bremañ : $2)",
+       "resettokens-watchlist-token": "Jedouer evit lanvad web (Atom/RSS) [[Special:Watchlist|kemmañ pajennoù eus ho roll evezhiañ]]",
        "resettokens-done": "Jedoueroù adderaouekaet.",
        "resettokens-resetbutton": "Adderaouekaat ar jedoueroù diuzet",
        "bold_sample": "Testenn dev",
        "preview": "Rakwelet",
        "showpreview": "Rakwelet",
        "showdiff": "Diskouez ar c'hemmoù",
+       "blankarticle": "<strong>Taolit evezh :</strong> Goullo eo ar bajenn emaoc'h o krouiñ.\nMar klikit war \"{{int:savearticle}}\" en-dro e vo krouet hep netra ebet e-barzh.",
        "anoneditwarning": "</strong>Diwallit :</strong> N'oc'h ket kevreet.\nGallout a raio an holl dud gwelet ho chomlec'h IP ma rit kemmoù. Ma <strong>[$1kevreit]</strong>pe<strong>[$2 krouit ur gont]</strong>, e vo deroet ho kemmoù d'hoc'h anv-implijer, e-touez spletoù all.",
        "anonpreviewwarning": "''N'oc'h ket kevreet. Enrollañ a lakao war-wel ho chomlec'h IP e istor kemmoù ar bajenn.''",
        "missingsummary": "'''Taolit evezh:''' N'hoc'h eus ket lakaet tamm testenn diverrañ ebet evit ho kemmoù. Mar klikit war enrollañ en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
+       "selfredirect": "<strong>Taolit evezh :</strong> Emaoc'h oc'h adkas ar bajenn-mañ warni hec'h-unan.\nPe hoc'h eus spisaet ur pal a-dreuz evit an adkas pe emaoc'h o cheñch ur bajenn n'emañ ket da vezañ cheñchet evel-se.\nMar klikit war \"{{int:savearticle}}\" en-dro, e vo krouet an adkas forzh penaos.",
        "missingcommenttext": "Skrivit hoc'h evezhiadenn a-is.",
-       "missingcommentheader": "'''Taolit evezh :''' N'hoc'h eus lakaet tamm danvez/titl ebet d'hoc'h evezhiadenn.\nMar klikit war \"{{int:savearticle}}\" en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
-       "summary-preview": "Rakwelet an diverrañ :",
+       "missingcommentheader": "<strong>Taolit evezh :</strong> 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 un diverrañ eus ar c'hemmoù :",
        "subject-preview": "Rakwelet an danvez :",
        "previewerrortext": "C'hoarvezet ez eus ur fazi e-ser klask rakwelet ho kemmoù",
        "blockedtitle": "Implijer stanket",
        "blockedtext": "'''Stanket eo bet ho kont implijer pe ho chomlec'h IP'''\n\nGant $1 eo bet graet.\nSetu an abeg evit se : ''$2''.\n\n* Stanket adalek : $8\n* Stanket betek : $6\n* Pad ar stankadenn : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar [[{{MediaWiki:Grouppage-sysop}}|verourien]] all evit eskemm ganto war se. N'hallit implijout an arc'hwel 'kas ur postel d'an implijer-mañ' nemet ma'z eus bet spisaet ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù kont]] ha ma n'eo ket bet stanket.\n$3 eo ho chomlec'h IP, ha #$5 eo niverenn an identelezh stanket.\nMerkit anezho en ho koulennoù bep tro.",
        "autoblockedtext": "Stanket eo bet ho chomlec'h IP ent emgefreek rak implijet e veze gant un implijer all bet stanket gant $1.\nSetu aze an abeg :\n\n: ''$2''\n\n* Deroù ar stankadenn : $8\n* Termen ar stankadenn : $6\n* Kont stanket : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar\n[[{{MediaWiki:Grouppage-sysop}}|verourien]] all ma kavit abeg er stankadenn.\n\nNotennit mat ne c'hallot implijout an dibarzh \"kas ur postel d'an implijer\" nemet ma'z eus bet merket ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù implijer]] ha ma n'eo ket bet stanket ivez.\n\n$3 eo ho chomlec'h IP evit poent ha #$5 ho niverenn stankadenn.\nMerkit mat an titouroù-se war kement goulenn savet ganeoc'h.\n\n$5 eo ho niverenn stankadenn. Merkit mat an niverenn-se pa rit goulennoù.",
+       "systemblockedtext": "Stanket eo bet hoc'h anv implijer pe ho chomlec'h IP ent emgefre gant MediaWiki.\nSetu perak :\n\n:<em>$2</em>\n\n* Deroù ar stankadenn : $8\n* Termen ar stankadenn : $6\n* Hinienn a sell ar stankadenn outi : $7\n\n$3 eo ho chomlec'h IP diouzhtu.\nMerkit mat ar munudoù skrivet a-us er c'hlemmoù a c'halljec'h ober.",
        "blockednoreason": "n'eus bet roet abeg ebet",
        "whitelistedittext": "Ret eo deoc'h en em $1 evit gallout skridaozañ.",
        "confirmedittext": "Rankout a ri bezañ kadarnaet ho chomlec'h postel a-raok gallout kemmañ pajennoù. Skrivit ha kadarnait ho chomlec'h postel en ho [[Special:Preferences|penndibaboù implijer]] mar plij.",
        "accmailtext": "Kaset ez eus bet ur ger-tremen dargouezhek evit [[User talk:$1|$1]] da $2. Cheñchet e c'hall ar ger-tremen evit ar gont nevez-mañ bezañ war ar bajenn ''[[Special:ChangePassword|cheñch ger-tremen]]'', ur wezh kevreet.",
        "newarticle": "(Nevez)",
        "newarticletext": "Heuliet hoc'h eus ul liamm a gas d'ur bajenn n'eo ket bet savet evit c'hoazh.\nA-benn krouiñ ar bajenn-se, krogit da skrivañ er prenestr skridaozañ dindan (gwelet ar [$1 bajenn skoazell] evit gouzout hiroc'h).\nM'emaoc'h en em gavet amañ dre fazi, klikit war bouton '''kent''' ho merdeer evit mont war ho kiz.",
-       "anontalkpagetext": "---- ''Homañ eo ar bajenn gaozeal evit un implijer(ez) dizanv n'eus ket krouet kont ebet evit c'hoazh pe na implij ket anezhi.\nSetu perak e rankomp ober gant ar chomlec'h IP niverel evit anavezout anezhañ/i.\nGallout a ra ur chomlec'h a seurt-se bezañ rannet etre meur a implijer(ez).\nMa'z oc'h un implijer(ez) dizanv ha ma stadit ez eus bet kaset deoc'h kemennadennoù na sellont ket ouzhoc'h, gallout a rit [[Special:CreateAccount|krouiñ ur gont]]pe [[Special:UserLogin|kevreañ]] kuit a vagañ muioc'h a gemmesk gant implijerien dizanv all.",
+       "anontalkpagetext": "<em>Homañ eo ar bajenn gaozeal evit un implijer dizanv n'en deus ket krouet kont ebet evit c'hoazh pe na implij ket anezhi</em>.\nSetu perak e rankomp ober gant ar chomlec'h IP niverel evit anavezout anezhañ.\nGallout a ra ur chomlec'h a seurt-se bezañ rannet etre meur a implijer.\nMa'z oc'h un implijer dizanv ha ma stadit ez eus bet kaset deoc'h kemennadennoù na sellont ket ouzhoc'h, gallout a rit [[Special:CreateAccount|krouiñ ur gont]] pe [[Special:UserLogin|kevreañ]] kuit a vagañ muioc'h a gemmesk gant implijerien dizanv all.",
        "noarticletext": "N'eus tamm skrid ebet war ar bajenn-mañ evit poent.\nGallout a rit [[Special:Search/{{PAGENAME}}|klask an titl anezhi]] e pajennoù all,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} klask en oberiadennoù liammet], pe [{{fullurl:{{FULLPAGENAME}}|action=edit}} krouiñ ar bajenn]</span>.",
        "noarticletext-nopermission": "N'eus, evit ar mare, tamm testenn ebet war ar bajenn-mañ.\nGallout a rit [[Special:Search/{{PAGENAME}}|klask titl ar bajenn-mañ]] war pajennoù all,\npe <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} klask er marilhoù kar]</span>, met n'oc'h ket aotreet da grouiñ ar bajenn-mañ.",
        "missing-revision": "N'eus ket eus adwel niv. $1 eus ar bajenn anvet « {{FULLPAGENAME}} ».\n\nC'hoarvezout a ra peurliesañ pa vez heuliet ul liamm istorel dispredet war-zu ur bajenn zo bet dilamet.\nGallout a reot kavout muioc'h a vunudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
        "userpage-userdoesnotexist": "N'eo ket enrollet ar gont \"<nowiki>$1</nowiki>\". Merkit ma fell deoc'h krouiñ/kemmañ ar bajenn-mañ.",
        "userpage-userdoesnotexist-view": "N'eo ket enrollet ar gont implijer \"$1\".",
        "blocked-notice-logextract": "Stanket eo an implijer-mañ evit poent.\nDindan emañ merket moned diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
-       "clearyourcache": "Notenn :''' Goude bezañ enrollet ho pajenn e rankot freskaat krubuilh ho merdeer a-benn gwelet ar c'hemmoù.\n* '''Firefox / Safari:''' Derc'hel da bouezañ war ''Pennlizherenn'' en ur glikañ war ''Adkargañ'', pe pouezañ war ''Ctrl-F5'' pe ''Ctrl-R'' (''⌘-R'' war ur Mac); \n* ''''Google Chrome:''' Pouezañ war ''Ctrl-Pennlizh-R'' (''⌘-Shift-R'' war ur Mac)\n* '''Internet Explorer:''' Derc'hel da bouezañ war ''Ctrl'' en ur glikañ war ''Freskaat,'' pe pouezañ war ''Ctrl-F5''\n* ''''Konqueror: '''Klikañ war ''Adkargañ'' pe pouezañ war ''F5;'' \n* '''Opera:''' Riñsañ ar grubuilh e ''Ostilhoù → Penndibaboù''",
+       "clearyourcache": "<strong>Notenn :</strong> Goude bezañ enrollet ho pajenn e rankot freskaat krubuilh ho merdeer a-benn gwelet ar c'hemmoù.\n* <strong>Firefox / Safari:</strong> Derc'hel da bouezañ war <em>Pennlizherenn</em> en ur glikañ war <em>Adkargañ</em>, pe pouezañ war <em>Ctrl-F5</em> pe <em>Ctrl-R</em> (<em>⌘-R</em> war ur Mac); \n* <strong>Google Chrome:</strong> Pouezañ war <em>Ctrl-Pennlizh-R</em> (<em>⌘-Shift-R</em> war ur Mac)\n* <strong>Internet Explorer :</strong> Derc'hel da bouezañ war <em>Ctrl</em> en ur glikañ war <em>Freskaat</em>, pe pouezañ war <em>Ctrl-F5</em>\n* <strong>Konqueror :</strong> Klikañ war <em>Adkargañ</em> pe pouezañ war <em>F5</em>\n* <strong>Opera :</strong> Mont da <em>Arventennoù → lañser</em> (<em>Opera → Penndibaboù</em> war ur Mac) ha goude mont da <em>Prevezded & surentez → Riñsañ roadennoù ar grubuilh → Skeudennoù krubuilhet ha restroù</em>.",
        "usercssyoucanpreview": "'''Tun :''' Grit gant ar bouton \"{{int:showpreview}}\" evit testiñ ho follenn CSS nevez a-raok enrollañ anezhi.",
        "userjsyoucanpreview": "'''Tun :''' Grit gant ar bouton \"{{int:showpreview}}\" evit testiñ ho follenn JS nevez a-raok enrollañ anezhi.",
        "usercsspreview": "'''Dalc'hit soñj n'emaoc'h ken nemet o rakwelet ho follenn CSS deoc'h.'''\n'''N'eo ket bet enrollet evit c'hoazh!'''",
        "previewnote": "'''Diwallit mat, n'eus ken ur rakweled eus an destenn-mañ.'''\nN'eo ket bet enrollet ho kemmoù evit c'hoazh !",
        "continue-editing": "Mont d'an takad kemmañ",
        "previewconflict": "Gant ar rakweled e teu testenn ar bajenn war wel evel ma vo pa vo bet enrollet.",
-       "session_fail_preview": "'''Ho tigarez! N'eus ket bet tu da enrollañ ho kemmoù rak kollet eo bet roadennoù an dalc'h.'''\nKlaskit en-dro mar plij.\nMa ne'z a ket en-dro c'hoazh, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ war-lerc'h.",
-       "session_fail_preview_html": "'''Ho tigarez! N'omp ket bet gouest da enrollañ ho kemmoù rak kollet ez eus bet roadennoù e-kerzh an dalc'h.'''\n\n''Gweredekaet eo al linennoù HTML e {{SITENAME}}. Rak-se eo kuzh ar rakweledoù a-benn en em zifenn diouzh an tagadennoù JavaScript.''\n\n'''Mard e oa onest ar c'hemmoù hoc'h eus klasket degas, klaskit en-dro. '''\nMar ned a ket en-dro, klaskit [[Special:UserLogout|digevreañ]] ha kevreañ en-dro.",
+       "session_fail_preview": "Ho tigarez ! N'eus ket bet tu da enrollañ ho kemmoù rak kollet eo bet roadennoù an dalc'h.\n\nMarteze n'oc'h ket kevreet ken. <strong>Gwiriit emaoc'h mat kevreet ha klaskit en-dro</strong>.\n\nMa ne'z a ket en-dro c'hoazh, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ war-lerc'h. Gwiriit mat e asant ho merdeer resev toupinoù a-berzh al lec'hienn-mañ ivez.",
+       "session_fail_preview_html": "Ho tigarez ! N'omp ket bet gouest da enrollañ ho kemmoù rak kollet ez eus bet roadennoù e-kerzh an dalc'h.\n\n<em>Gweredekaet eo al linennoù HTML e {{SITENAME}}. Rak-se eo kuzh ar rakweledoù a-benn en em zifenn diouzh an tagadennoù JavaScript.</em>\n\n<strong>Ma oa reizh ar c'hemmoù hoc'h eus klasket degas, klaskit en-dro.</strong>\nMa ned a ket en-dro, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ goude. Gwiriit e asant mat ho merdeer degemer toupinoù a-berzh al lec'hienn-mañ ivez.",
        "token_suffix_mismatch": "'''Distaolet eo bet ar c'hemmoù degaset ganeoc'h abalamour ma oa bet kemmesket an arouezennoù poentadur gant ho merdeer en daveer kemmañ. Distaolet eo bet ar c'hemmoù kuit na vije breinet ar bajennad skrid.\nC'hoarvezout a ra a-wechoù pa implijit ur servijer proksi dreinek dizanav.'''",
        "edit_form_incomplete": "'''Darn eus ar furmskrid kemmañ zo chomet hep tizhout ar servijer ; gwiriit ervat emañ mat ho kemmoù tre evel m'int bet graet ganeoc'h ha klaskit en-dro.'''",
        "editing": "Oc'h aozañ $1",
        "yourdiff": "Diforc'hioù",
        "copyrightwarning": "Sellet e vez ouzh an holl degasadennoù graet war {{SITENAME}} evel ouzh degasadennoù a zouj da dermenoù ar $2 (Sellet ouzh $1 evit gouzout hiroc'h). Mar ne fell ket deoc'h e vefe embannet ha skignet ho skridoù, arabat kas anezho.<br />\nHeñveldra, prometiñ a rit kemer perzh dre zegas skridoù savet ganeoc'h hepken pe tennet eus ur vammenn frank a wirioù.\n'''NA IMPLIJIT KET LABOURIOÙ GANT GWIRIOÙ AOZER (COPYRIGHT) HEP AOTRE D'OBER KEMENT-SE!'''",
        "copyrightwarning2": "Notit mat e c'hall kement degasadenn graet ganeoc'h war {{SITENAME}} bezañ kemmet, adaozet pe lamet kuit gant an implijerien all. Mar ne fell ket deoc'h e vije kemmet-digemmet ar pezh hoc'h eus skrivet na gemerit ket perzh er raktres-mañ.<br /> Gouestlañ a rit ivez eo bet savet ar boued spered ganeoc'h pe eilet diwar ur vammenn frank a wirioù pe en domani foran (gwelet $1 evit gouzout hiroc'h). '''NA IMPLIJIT KET LABOURIOÙ GANT GWIRIOÙ AOZER HEP AOTRE D'OBER KEMENT-SE!'''",
+       "editpage-cannot-use-custom-model": "N'haller ket cheñch patrom danvez ar bajenn-mañ.",
        "longpageerror": "'''FAZI : {{PLURAL:$1|Ur c'hilookted|$1 kilookted}} hir eo an destenn lakaet ganeoc'h, ar pezh zo hiroc'h eget {{PLURAL:$2|ur c'hilookted|$2 kilookted}}, ar vent vrasañ aotreet. N'haller ket enrollañ.'''",
-       "readonlywarning": "'''KEMENN DIWALL : prennet eo bet an diaz titouroù evit bezañ trezalc'het; setu ne viot ket evit enrollañ ho kemmoù diouzhtu-diouzhtu eta.'''\n\nGallout a rit eilañ ha pegañ ho testenn en ur restr skrid all hag enrollañ anezhi a-benn diwezhatoc'hik.'''\n\nSetu an displegadenn lakaet gant ar merour eo bet prennet an traoù gantañ : $1",
+       "readonlywarning": "<strong>Diwallit : prennet eo bet an diaz roadennoù evit bezañ trezalc'het; setu ne viot ket evit enrollañ ho kemmoù diouzhtu-diouzhtu eta.</strong>\n\nGallout a rit eilañ ha pegañ ho skrid en ur restr testenn all hag enrollañ anezhañ a-benn diwezhatoc'hik.\n\nSetu an displegadenn lakaet gant ar merour reizhiad eo bet prennet an traoù gantañ : $1",
        "protectedpagewarning": "'''KEMENN DIWALL: Gwarezet eo bet ar bajenn-mañ. N'eus nemet an implijerien ganto ar statud merour a c'hall kemmañ anezhi.'''\nEnmont diwezhañ ar marilh a ziskouezer amañ a-is evel dave :",
        "semiprotectedpagewarning": "''Notenn :''' Gwarezet eo ar bajenn-mañ; n'eus nemet an implijerien bet krouet ur gont ganto a kemmañ anezhi. Kasadenn ziwezhañ ar marilh zo diskouezet amañ a-is evel dave :",
-       "cascadeprotectedwarning": "'''Diwallit :''' Prennet eo ar bajenn-mañ. N'eus nemet ar verourien a c'hall kemmañ anezhi peogwir he c'haver {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :",
+       "cascadeprotectedwarning": "<strong>Diwallit :</strong> Prennet eo ar bajenn-mañ. N'eus nemet ar verourien a c'hall kemmañ anezhi peogwir emañ treuzkludet {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :",
        "titleprotectedwarning": "'''DIWALLIT :  Gwarezet eo bet ar bajenn-mañ e doare ma ranker kaout [[Special:ListGroupRights|gwirioù dibar]] a-benn krouiñ anezhi.''' Kasadenn ziwezhañ ar marilh a zo diskouezet amañ a-is evel dave :",
        "templatesused": "{{PLURAL:$1|Patrom|Patromoù}} implijet war ar bajenn-mañ :",
        "templatesusedpreview": "{{PLURAL:$1|Patrom|Patromoù}} implijet er rakweladenn-mañ :",
        "permissionserrors": "Fazi aotre",
        "permissionserrorstext": "N'oc'h ket aotreet d'ober kement-mañ evit {{PLURAL:$1|an abeg-mañ|an abegoù-mañ}} :",
        "permissionserrorstext-withaction": "N'oc'h ket aotreet da $2, evit an {{PLURAL:$1|abeg-mañ|abeg-mañ}} :",
+       "contentmodelediterror": "N'hallit ket kemmañ an adweladenn-mañ peogwir ez eo par he fatrom danvez da <code>$1</code>, ar pezh zo disheñvel diouzh ar patrom danvez implijet bremañ war ar bajenn <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Diwallit : Emaoc'h o krouiñ ur bajenn zo bet diverket c'hoazh.'''\n\nEn em soñjit ervat ha talvoudus eo kenderc'hel krouiñ ar bajenn.\nDeoc'h da c'houzout, aze emañ ar marilhoù diverkañ hag adenvel :",
        "moveddeleted-notice": "Diverket eo bet ar bajenn-mañ.\nDindan emañ ar marilh diverkañ hag adenvel.",
+       "moveddeleted-notice-recent": "Ho tigarez, nevez ziverket eo bet ar bajenn-mañ (e-kerzh an 24 eurvezh tremenet).\nDindan emañ ar marilhoù diverkañ hag adenvel evit ho kelaouiñ.",
        "log-fulllog": "Gwelet ar marilh klok",
        "edit-hook-aborted": "C'hwitet ar c'hemmañ gant un astenn.\nAbeg dianav.",
        "edit-gone-missing": "Dibosupl hizivaat ar bajenn.\nDiverket eo bet evit doare.",
        "invalid-content-data": "n'eo ket mat roadennoù an endalc'had",
        "content-not-allowed-here": "N'eo ket aotreet an endalc'had \"$1\" er bajenn [[$2]]",
        "editwarning-warning": "Mar kuitait ar bajenn-mañ e c'hallit koll ar c'hemmoù degaset ganeoc'h.\nMa'z oc'h kevreet e c'hallit diweredekaat ar c'hemenn-diwall-mañ e rann \"{{int:prefs-editing}}\" en ho penndibaboù.",
+       "editpage-invalidcontentmodel-title": "N'eo ket skoret ar patrom danvez",
+       "editpage-invalidcontentmodel-text": "N'eo ket skoret ar patrom danvez \"$1\".",
        "editpage-notsupportedcontentformat-title": "Furmad endalc'had ha n'eo ket kemeret e karg",
+       "editpage-notsupportedcontentformat-text": "N'eo ket skoret ar patrom $1 gant ar patrom danvez $2.",
        "content-model-wikitext": "wikitestenn",
        "content-model-text": "testenn blaen",
        "content-model-javascript": "Javascript",
        "content-model-css": "CSS",
        "content-json-empty-object": "Elfenn goullo",
-       "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.",
+       "content-json-empty-array": "Taolenn c'houllo",
+       "deprecated-self-close-category": "Pajennoù a ra gant tikedennoù HTML emserriñ direizh",
+       "deprecated-self-close-category-desc": "Er bajenn-mañ ez eus tikedennoù HTML emserriñ, evel <code>&lt;b/></code> pe <code>&lt;span/></code>.  Cheñch a raio o emzalc'h a-raok pell evit bezañ diouzh an erbedadennoù HTML5. Gant se eo dispredet implijout anezho er wikitestenn.",
+       "duplicate-args-warning": "<strong>Taolit evezh : Emañ </strong> [[:$1]] o c'hervel [[:$2]] gant muioc'h eget un talvoud evit an arventenn \"$3\". N'eus nemet an talvoud pourchaset da ziwezhañ a vo implijet.",
+       "duplicate-args-category": "Pajennoù a ra gant arguzennoù eilet er galvoù patrom",
+       "duplicate-args-category-desc": "Er bajenn-mañ ez eus galvoù patroù a ra gant arguzennoù eilet, evel <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> pe <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "expensive-parserfunction-warning": "<strong>Diwallit :</strong>: Re a c'halvoù koustus e-keñver an arc'hwelioù parser zo er bajenn-mañ.\n\nDleout a rafe bezañ nebeutoc'h eget $2 {{PLURAL:$2|galv}}, ha {{PLURAL:$1|$1 galv}} zo.",
        "expensive-parserfunction-category": "Pagjennoù enno re a c'halvoù koustus e-keñver an arc'hwelioù parser.",
        "post-expand-template-inclusion-warning": "Diwallit : re a batromoù zo war ar bajenn-mañ.\nLod anezho a vo lakaet a-gostez.",
        "post-expand-template-inclusion-category": "Pajennoù enno re a batromoù",
        "post-expand-template-argument-warning": "Diwallit : war ar bajenn-mañ ez eus eus da nebeutañ un arventenn eus ur patrom zo re vras.\nA-gostez eo bet lezet an arventenn-se.",
        "post-expand-template-argument-category": "Pajennoù enno arventennoù patrom bet lezet a-gostez",
        "parser-template-loop-warning": "Patrom e kelc'h detektet : [[$1]]",
-       "parser-template-recursion-depth-warning": "Tizhet bevenn donder galvoù ar patromoù ($1)",
+       "parser-template-recursion-depth-warning": "Tizhet bevenn donder galvoù rekursivek ar patromoù ($1)",
        "language-converter-depth-warning": "Aet eur en tu all d'ar vevenn amdreiñ yezhoù ($1)",
        "node-count-exceeded-category": "Pajennoù m'eur aet en tu all d'an niver a skoulmoù",
        "node-count-exceeded-category-desc": "Mont a ra ar bajenn-mañ en tu all da gont uhelañ ar skoulmoù.",
        "undo-summary": "Dizober kemmoù $1 a-berzh [[Special:Contributions/$2|$2]] ([[User talk:$2|kaozeal]])",
        "undo-summary-username-hidden": "Dizober ar reizhadenn $1 gant un implijer kuzhet",
        "cantcreateaccount-text": "Stanket eo bet ar c'hrouiñ kontoù adal ar chomlec'h IP ('''$1''') gant [[User:$3|$3]].\n\nAn abeg roet gant $3 zo ''$2''",
+       "cantcreateaccount-range-text": "Berzet eo bet gant [[User:$3|$3]] ar c'hrouiñ kontoù adalek ar chomlec'hioù IP el lijorennoù <strong>$1</strong> m'emañ ho chomlec'h IP (<strong>$4</strong>), \n\n<em>$2</em> eo an abeg roet gant $3",
        "viewpagelogs": "Gwelet ar marilhoù evit ar bajenn-mañ",
        "nohistory": "Ar bajenn-mañ n'he deus tamm istor ebet.",
        "currentrev": "Stumm a-vremañ pe stumm red",
        "history-feed-description": "Istor ar c'hemmoù degaset war ar bajenn-mañ eus ar wiki",
        "history-feed-item-nocomment": "$1 d'an $2",
        "history-feed-empty": "Ar bajenn goulennet n'eus ket anezhi.\nMarteze eo bet diverket eus ar wiki, pe adanvet.\nImplijit [[Special:Search|klaskit er wiki]] evit kavout pajennoù all a c'hallfe klotañ.",
+       "history-edit-tags": "Kemmañ tikedennoù ar stummoù diuzet",
        "rev-deleted-comment": "(diverradenn ar c'hemm diverket)",
        "rev-deleted-user": "(anv implijer diverket)",
-       "rev-deleted-event": "(elfenn dilamet)",
+       "rev-deleted-event": "(munudoù ar marilh bet dilamet)",
        "rev-deleted-user-contribs": "[anv implijer pe chomlec'h IP diverket - kemm kuzhet diouzh an degasadennoù]",
        "rev-deleted-text-permission": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nMarteze e kavot munudoù war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} roll ar pajennoù diverket].",
+       "rev-suppressed-text-permission": "<strong>Diverket</strong> eo bet ar stumm-mañ eus ar bajenn.\nGallout a reot kavout ar munudoù e [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} marilh an diverkadennoù].",
        "rev-deleted-text-unhide": "!'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nMarteze e kavot munudoù war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].\nGallout a rit [$1 gwelet ar stumm-se] c'hoazh mar fell deoc'h kenderc'hel.",
        "rev-suppressed-text-unhide": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nTitouroù zo da gaout war [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].\nGallout a rit [$1 gwelet ar stumm-se] c'hoazh mar fell deoc'h kenderc'hel.",
        "rev-deleted-text-view": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nGallout a rit sellet outañ ; titouroù all a gavot war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].",
        "rev-showdeleted": "diskouez",
        "revisiondelete": "Diverkañ/diziverkañ stummoù",
        "revdelete-nooldid-title": "N'eus stumm pal ebet evit an degasadennoù",
-       "revdelete-nooldid-text": "Pe n'eo ket bet spisaet ganeoc'h ar stumm(où) pal da implijout an arc'hwel-mañ evito. pe n'eus ket eus ar stummoù spisaet, pe emaoc'h o klask kuzhat ar stumm red.",
+       "revdelete-nooldid-text": "Pe n'eus ket bet spisaet ganeoc'h stumm pal ebet da lakaat an arc'hwel-mañ da vont en-dro warnañ, pe n'eus ket eus ar stummoù spisaet, pe emaoc'h o klask kuzhat ar stumm red.",
        "revdelete-no-file": "N'eus ket eus ar restr spisaet ganeoc'h.",
        "revdelete-show-file-confirm": "Ha sur oc'h e fell deoc'h gwelet stumm diverket ar restr \"<nowiki>$1</nowiki>\" deiziataet eus an $2 da $3?",
        "revdelete-show-file-submit": "Ya",
+       "revdelete-selected-text": "{{PLURAL:$1|Stummoù diuzet|Stumm diuzet}} of [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Stumm eus ar restr diuzet}} evit [[:$2]] :",
        "logdelete-selected": "{{PLURAL:$1|Darvoud eus ar marilh diuzet}} :",
+       "revdelete-text-text": "Dont a raio c'hoazh war wel ar stummoù diverket en istor ar bajenn met ne c'hallo ket an dud gwelet darn eus an danvez ken.",
        "revdelete-text-file": "Dalc'het e vo da welet stummoù restroù dilamet en istor ar restr, nemet ne c'hallo ket an dud mont da welet un darn anezho.",
        "logdelete-text": "Gwelet e vo c'hoazh dilamadennoù er marilhoù, nemet ne c'hallo ket an dud mont da welet un darn anezho.",
        "revdelete-text-others": "Ar verourien a c'hallo c'hoazh mont da welet petra zo e-barzh, hag eilpennañ an dilamadenn, nemet ha reolennoù strishoc'h ouzhpenn a vefe.",
        "revdelete-legend": "Lakaat strishadurioù gwelet",
        "revdelete-hide-text": "Testenn ar stumm",
        "revdelete-hide-image": "Kuzhat danvez ar restr",
-       "revdelete-hide-name": "Kuzhat an ober hag ar vukadenn",
+       "revdelete-hide-name": "Kuzhat ar pal hag an arventennoù",
        "revdelete-hide-comment": "Notenn ar c'hemm",
        "revdelete-hide-user": "Anv implijer pe chomlec'h IP an aozer",
        "revdelete-hide-restricted": "Diverkañ ar roadennoù kement d'ar verourien ha d'ar re all",
        "revdelete-unsuppress": "Lemel ar strishadurioù war ar stummoù assavet",
        "revdelete-log": "Abeg :",
        "revdelete-submit": "Lakaat da dalvezout evit an {{PLURAL:$1|adweladenn|adweladennoù}} diuzet",
-       "revdelete-success": "''Gweluster ar stummoù hizivaet mat.'''",
+       "revdelete-success": "Gweluster ar stummoù hizivaet.",
        "revdelete-failure": "''Dibosupl hizivaat gweluster ar stumm :'''\n$1",
-       "logdelete-success": "'''Gweluster ar marilh arventennet evel m'eo dleet.'''",
+       "logdelete-success": "Kemmet eo bet gweluster ar marilh.",
        "logdelete-failure": "'''N'eus ket bet gallet termeniñ gweluster ar marilh :'''\n$1",
        "revdel-restore": "Cheñch ar gweluster",
        "pagehist": "Istor ar bajenn",
        "mergehistory-go": "Diskouez ar stummoù a c'haller kendeuziñ",
        "mergehistory-submit": "Kendeuziñ ar stummoù",
        "mergehistory-empty": "N'haller ket kendeuziñ stumm ebet.",
-       "mergehistory-done": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm|stumm}} eus $1 e [[:$2]].",
+       "mergehistory-done": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm}} eus $1 e [[:$2]].",
        "mergehistory-fail": "Dibosupl kendeuziñ an istorioù. Gwiriit ar bajenn hag arventennoù an deiziadoù.",
+       "mergehistory-fail-bad-timestamp": "Merk amzer direizh.",
+       "mergehistory-fail-invalid-source": "Pajenn darzh direizh.",
+       "mergehistory-fail-invalid-dest": "Pajenn vuket direizh.",
+       "mergehistory-fail-no-change": "N'eus ket bet kendeuzet stumm ebet p'eo bet kendeuzet an istor. Gwiriit en-dro ar bajenn hag an arventennoù amzer.",
+       "mergehistory-fail-permission": "Re izel eo ho kwirioù evit gallout kendeuziñ an istor.",
+       "mergehistory-fail-self-merge": "Mammenn ha pal ar bajenn n'hall ket bezañ heñvel.",
+       "mergehistory-fail-timestamps-overlap": "En em frikañ a ra stummoù ar vammenn pe dont a reont war-lerc'h stummoù pal.",
        "mergehistory-fail-toobig": "Ne c'haller ket kendeuziñ an istorioù o vezañ ma vefe mont en tu all d'ar harzh a $1 reizhadenn da zilec'hiañ.",
        "mergehistory-no-source": "N'eus ket eus ar bajenn orin $1.",
        "mergehistory-no-destination": "N'eus ket eus ar bajenn dal $1.",
        "search-category": "(rummad $1)",
        "search-file-match": "(klotañ a ra gant endalc'had ar restr)",
        "search-suggest": "N'hoc'h eus ket soñjet kentoc'h e : $1",
+       "search-rewritten": "O tiskouez disoc'hoù evit $1. Klask $2 kentoc'h.",
        "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-tokenwatchlist": "Jedouer",
        "prefs-diffs": "Diforc'hioù",
        "prefs-help-prefershttps": "Efediñ a ray an dibarzh-mañ kentañ gwech ma kevreoc'h.",
+       "prefswarning-warning": "Kemmet eo bet ho penndibaboù ganeoc'h, met enrollet n'int ket bet avat.\nMar kuitait ar bajenn-mañ hep klikañ war \"$1\" ne vo ket nevesaet ho penndibaboù",
        "prefs-tabs-navigation-hint": "Titourig : Gallout a rit implijout an touchennoù bir kleiz ha bir dehoù evit merdeiñ etre an ivinelloù e roll an ivinelloù.",
        "userrights": "Merañ statud an implijerien",
-       "userrights-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",
-       "userrights-editusergroup": "Kemmañ strolladoù an implijer",
-       "userrights-viewusergroup": "Gwelet ar strolladoù implijerien",
+       "editusergroup": "Kargañ strolladoù implijerien",
+       "editinguser": "O kemmañ gwirioù an {{GENDER:$1|implijer|implijerez}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Gwelet gwirioù an {{GENDER:$1|implijer|implijerez}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Kemmañ strolladoù an {{GENDER:$1|implijer|implijerez}}",
+       "userrights-viewusergroup": "Gwelet strolladoù an {{GENDER:$1|implijer|implijerez}}",
        "saveusergroups": "Enrollañ strolladoù an {{GENDER:$1|implijer|implijerez}}",
        "userrights-groupsmember": "Ezel eus :",
        "userrights-groupsmember-auto": "Ezel emplegat eus :",
-       "userrights-groups-help": "Cheñch strollad an implijer a c'hallit ober.\n* Ul log asket a verk emañ an implijer er strollad.\n* Ul log diask a verk n'emañ ket an implijer er strollad.\n* Ur * a verk n'hallit ket dilemel ar strollad ur wech bet ouzhpennet, pe ar c'hontrol.",
+       "userrights-groups-help": "Cheñch strolladoù an implijer a c'hallit ober.\n* Ul log asket a verk emañ an implijer er strollad.\n* Ul log diask a verk n'emañ ket an implijer er strollad.\n* Ur * a verk n'hallit ket dilemel ar strollad ur wech bet ouzhpennet ganeoc'h, pe ar c'hontrol.\n* Ur # a verk a c'hallit astenn termen echuiñ ar strollad hepken ; n'hallit ket berraat anezhañ.",
        "userrights-reason": "Abeg :",
        "userrights-no-interwiki": "N'oc'h ket aotreet da gemmañ ar gwirioù implijer war wikioù all.",
        "userrights-nodatabase": "N'eus ket eus an diaz titouroù $1 pe n'eo ket lec'hel.",
        "userrights-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-cannot-shorten-expiry": "N'hallit ket astenn termen echuiñ ar strollad \"$1\". N'eus nemet an implijerien aotreet da ouzhpennañ ha lemel ar strollad-mañ a c'hall astenn an termen.",
        "userrights-conflict": "Bec'h zo abalamour da gemmoù e gwirioù an implijerien. Adwelit an traoù, mar plij, ha kadarnait ho kemmoù.",
        "group": "Strollad :",
        "group-user": "Implijerien",
        "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-reupload-shared": "Gwaskañ restroù ent lec'hel war an diellaoueg vedia rannet",
        "right-upload_by_url": "Enporzhiañ ur restr adal ur chomlec'h URL",
        "right-purge": "Spujañ krubuilh ar pajennoù hep kadarnaat",
-       "right-autoconfirmed": "Kemmañ ar pajennoù damwarezet",
+       "right-autoconfirmed": "Na vezañ trubuilhet gant ar bevennoù kas liammet ouzh ar chomlec'hioù IP",
        "right-bot": "Plediñ ganti evel gant un argerzh emgefre",
        "right-nominornewtalk": "Arabat diskouez ar c'hemenn \"Kemennoù nevez zo ganeoc'h\" pa vez lakaet kemmoù dister e pajenn gaozeal un implijer",
        "right-apihighlimits": "Kreskiñ ar bevennoù er goulennoù API",
        "right-deletedtext": "Gwelet ar skrid diverket hag an diforc'hioù etre ar stummoù diverket",
        "right-browsearchive": "Klask pajennoù bet diverket",
        "right-undelete": "Assevel ur bajenn",
-       "right-suppressrevision": "Teuler ur sell war ar stummoù kuzhet ouzh ar verourien hag assevel anezho",
+       "right-suppressrevision": "Gwelet, kuzhat ha diguzhat stummoù resis pajennoù zo diouzh selloù an implijerien all",
+       "right-viewsuppressed": "Gwelet ar stummoù kuzhet diouzh an implijerien all",
        "right-suppressionlog": "Gwelet ar marilhoù prevez",
        "right-block": "Mirout ouzh an implijerien all a gemmañ pajennoù pelloc'h",
        "right-blockemail": "Mirout ouzh un implijer a gas posteloù",
        "right-hideuser": "Stankañ un implijer, en ur guzhat anezhañ diouzh ar re all",
        "right-ipblock-exempt": "Tremen dreist an IPoù stanket, ar stankadennoù emgefre hag ar bloc'hadennoù IP stanket",
        "right-unblockself": "En em zistankañ",
-       "right-protect": "Kemmañ live gwareziñ ar pajennoù ha kemmañ ar pajennoù gwarezet",
+       "right-protect": "Kemmañ live gwareziñ ar pajennoù ha kemmañ ar pajennoù gwarezet dre skalierad",
        "right-editprotected": "Aozañ ar pajennoù gwarezet evel \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Aozañ ar pajennoù gwarezet evel \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Kemmañ patrom danvez ur bajenn bennak",
        "right-editinterface": "Kemmañ an etrefas implijer",
        "right-editusercssjs": "Kemmañ restroù CSS ha JS implijerien all",
        "right-editusercss": "Kemmañ restroù CSS implijerien all",
        "right-editmyusercss": "Aozañ ho restroù implijer CSS deoc'h-c'hwi",
        "right-editmyuserjs": "Aoazañ ho restroù JavaScript implijer deoc'h-c'hwi",
        "right-viewmywatchlist": "Gwelet ho roll-evezhiañ deoc'h-c'hwi",
+       "right-editmywatchlist": "Kemmañ ho roll evezhiañ deoc'h-c'hwi. Notit mat e vo c'hoazh ouzhpennet pajennoù hep ar gwir-mañ gant obererezhioù zo.",
        "right-viewmyprivateinfo": "Gwelet ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
        "right-editmyprivateinfo": "Aozañ ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
        "right-editmyoptions": "Kemmañ ho penndibaboù",
        "right-siteadmin": "Prennañ ha dibrennañ ar bank-titouroù",
        "right-override-export-depth": "Ezporzhiañ ar pajennoù en ur lakaat e-barzh ar pajennoù liammet betek un donder a 5 live",
        "right-sendemail": "Kas ur postel d'an implijerien all",
+       "right-managechangetags": "Krouiñ ha gweredekaat/diweredekaat [[Special:Tags|tikedennoù]]",
+       "right-applychangetags": "Lakaat [[Special:Tags|an tikedennoù]] e pleustr asambles gant kemmoù an-unan",
+       "right-changetags": "Ouzhpennañ ha dilemel [[Special:Tags|tikedennoù]], diwar ziviz, war adweladennoù hiniennel pe monedoù marilh.",
+       "right-deletechangetags": "Diverkañ[[Special:Tags|tikedennoù]] a-ziwar an diaz roadennoù",
+       "grant-generic": "Pakad aotreoù \"$1\"",
+       "grant-group-page-interaction": "Etreober gant pajennoù",
+       "grant-group-file-interaction": "Etreober gant mediaoù",
+       "grant-group-watchlist-interaction": "Etreober gant ho roll evezhiañ",
        "grant-group-email": "Kas ur postel",
+       "grant-group-high-volume": "Seveniñ ur pikol obererezh",
+       "grant-group-customization": "Personeladur ha penndibaboù",
+       "grant-group-administration": "Seveniñ oberoù melestradurel",
+       "grant-group-private-information": "Gwelet ar roadennoù prevez diwar ho penn",
+       "grant-group-other": "Obererezh liesseurt",
        "grant-blockusers": "Stankañ ha distankañ implijerien",
        "grant-createaccount": "Krouiñ kontoù",
        "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-uploadeditmovefile": "Enporzhiañ, erlec'hiañ hag adenvel restroù",
+       "grant-uploadfile": "Enporzhiañ restroù nevez",
        "grant-basic": "Gwirioù diazez",
-       "grant-viewdeleted": "Gwelet an titouroù dilamet",
+       "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-changetags": "ouzhpennañ ha dilemel tikedennoù diwar ziviz diouzh adweladennoù hiniennel pe monedoù marilh",
        "action-deletechangetags": "Diverkañ tikedennoù a-ziwar an diaz-roadennoù",
+       "action-purge": "spurjañ ar bajenn-mañ",
        "nchanges": "$1 {{PLURAL:$1|kemm|kemm}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|abaoe ho kweladenn diwezhañ}}",
        "enhancedrc-history": "istor",
        "recentchanges-legend-heading": "<strong>Alc'hwez :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])",
        "recentchanges-submit": "Diskouez",
-       "rcnotefrom": "Setu aze roll ar c'hemmoù c'hoarvezet abaoe an <strong>$2</strong> (<strong>$1</strong> d'ar muiañ).",
+       "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-feedbacklink": "Reiñ ho soñj diwar-benn ar siloù (beta) nevez",
+       "rcfilters-highlightbutton-title": "Lakaat an disoc'hoù war wel",
+       "rcfilters-highlightmenu-title": "Dibabit ul liv",
+       "rcfilters-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",
+       "rcfilters-filter-logactions-description": "Obererezhioù melestradurel, krouiñ kontoù, diverkañ pajennoù, enporzhiañ...",
+       "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",
        "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": "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",
        "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-removed-from-category": "Diverket eo bet [[$1]] diouzh ar rummad",
+       "recentchanges-page-added-to-category": "[[:$1]] ouzhpennet d'ar rummad",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ouzhpennet d'ar rummad, [[Special:WhatLinksHere/$1|emañ ensoc'het ar bajenn-mañ e diabarzh pajennoù all]]",
+       "recentchanges-page-removed-from-category": "Diverket eo bet [[:$1]] diouzh ar rummad",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] dilamet diouzh ar rummad, [[Special:WhatLinksHere/$1|emañ ensoc'het ar bajenn-mañ e diabarzh pajennoù all]]",
+       "autochange-username": "Kemm emgefre gant MediaWiki",
        "upload": "Kargañ war ar servijer",
        "uploadbtn": "Kargañ ur restr",
        "reuploaddesc": "Distreiñ d'ar furmskrid.",
        "uploaderror": "Fazi enporzhiañ",
        "upload-recreate-warning": "'''Diwallit''' : Diverket pe dilec'hiet ez eus bet ur restr gant an anv-se.'''\n\nDeoc'h da c'houzout, setu aze marilh an diverkañ hag an dilec'hiañ evit ar bajenn-mañ.",
        "uploadtext": "Grit gant ar furmskrid a-is evit enporzhiañ restroù war ar servijer.\nEvit sellet pe klask skeudennoù bet enporzhiet a-raok sellit ouzh [[Special:FileList|roll ar skeudennoù]]. Kavet e vo ar skeudennoù enporzhiet war [[Special:Log/upload|marilh ar pajennoù enporzhiet]] hag an diverkadennoù war [[Special:Log/delete|istor an diverkadennoù]].\n\nEvit enklozañ ur skeudenn en ur pennad, lakait er pennad-se ul liamm skrivet evel-henn :\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:anv_ar_restr.jpg]]</nowiki></code>''' evit diskouez ar restr en he spider brasañ ;\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:anv_ar_restr.png|deskrivadenn]]</nowiki></code>''' evit ober gant ur munud 200 piksel ledander er ur voest a-gleiz enni \"testenn zeskrivañ\" da zeskrivadenn\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:anv_ar_restr.ogg]]</nowiki></code>''' evit sevel ul liamm war-eeun war-du ar restr hep diskouez anezhi.",
-       "upload-permitted": "Seurtoù restroù aotreet : $1.",
-       "upload-preferred": "Seurtoù restroù gwellañ : $1.",
-       "upload-prohibited": "Seurtoù restroù berzet : $1.",
+       "upload-permitted": "{{PLURAL:$2|Seurt|Seurtoù}} restr aotreet : $1.",
+       "upload-preferred": "{{PLURAL:$2|Seurt|Seurtoù}} restr karetañ : $1.",
+       "upload-prohibited": "{{PLURAL:$2|Seurt|Seurtoù}} restr berzet : $1.",
        "uploadlogpage": "Marilh ar pajennoù enporzhiet",
        "uploadlogpagetext": "Setu a-is marilh ar restroù diwezhañ bet karget war ar servijer.\nS.o [[Special:NewFiles|rann ar skeudennoù nevez]] evit kaout ur sell gwiroc'h",
        "filename": "Anv ar restr",
        "largefileserver": "Brasoc'h eo ar restr-mañ eget ar pezh a c'hall ar servijer aotren.",
        "emptyfile": "Evit doare eo goullo ar restr bet karget ganeoc'h. Moarvat eo abalamour d'an tipo en anv ar restr. Gwiriit mat e fell deoc'h pellgargañ ar restr-mañ.",
        "windows-nonascii-filename": "N'eo ket skoret anvioù ar restroù enno arouezennoù dibar gant ar wiki-mañ.",
-       "fileexists": "Ur restr all gant an anv-se zo c'hoazh.\nTrugarez da wiriañ <strong>[[:$1]]</strong> ma n'oc'h ket sur e fell deoc'h kemmañ anezhi.\n[[$1|thumb]]",
+       "fileexists": "Ur restr all gant an anv-mañ zo c'hoazh.\nTrugarez da wiriañ <strong>[[:$1]]</strong> ma n'{{GENDER:|oc'h}} ket sur e fell deoc'h kemmañ anezhi.\n[[$1|thumb]]",
        "filepageexists": "Amañ <strong>[[:$1]]</strong> eo bet krouet ar bajenn zeskrivañ evit ar restr-mañ, padal n'eus restr ebet dezhi an anv-se evit c'hoazh.\nAn diverradenn skrivet ganeoc'h ne vo ket gwelet war ar bajenn zeskrivañ.\nMar fell deoc'h e teufe ho tiverradenn war wel eno eo ret deoc'h-c'hwi kemmañ anezhi hoc'h-unan.\n[[$1|thumb]]",
-       "fileexists-extension": "Bez' ez eus dija ur restr gant an anv-se war-bouez nebeut : [[$2|thumb]]\n* Anv ar restr emeur oc'h enporzhiañ : <strong>[[:$1]]</strong>\n* Anv ar restr zo anezhi dija : <strong>[[:$2]]</strong>\nDibabit un anv all mar plij.",
+       "fileexists-extension": "Bez' ez eus ur restr gant an hevelep anv koulz lavaret : [[$2|thumb]]\n* Anv ar restr emeur oc'h enporzhiañ : <strong>[[:$1]]</strong>\n* Anv ar restr zo anezhi c'hoazh : <strong>[[:$2]]</strong>\nDibab un anv all a fell deoc'h kentoc'h marteze ?",
        "fileexists-thumbnail-yes": "Evit doare ez eus ur skeudenn krennet he ment eus ar restr ''(thumbnail)''. [[$1|thumb]]\nGwiriit ar restr <strong>[[:$1]]</strong>.\nMard eo an hevelep skeudenn ha hini ar restr orin, ha heñvel he ment, n'eo ket dav pellgargañ ur stumm krennet ouzhpenn.",
        "file-thumbnail-no": "Kregiñ a ra anv ar restr gant <strong>$1</strong>.\nEvit doare eo ur skeudenn krennet he ment ''(thumbnail)''.\nMa'z eus ganeoc'h ur skeudenn uhel he fizhder, pellgargit anezhi; a-hend-all cheñchit anv ar restr.",
        "fileexists-forbidden": "Ur restr all gant an anv-se zo c'hoazh ha n'hall ket bezan diverket.\nMar fell deoc'h enporzhiañ ho restr memes tra, kit war ho kiz ha grit gant un anv all [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ur restr all dezhi an hevelep anv zo c'hoazh er c'havlec'h eskemm restroù.\nMar fell deoc'h enporzhiañ ar restr-mañ da vat, kit war ho kiz hag enporzhiit anezhi adarre dindan un anv all. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Rik-heñvel ouzh ar stumm a-vremañ eus <strong>[[:$1]]</strong> eo an enporzhiadenn-mañ.",
+       "fileexists-duplicate-version": "Rik-heñvel ouzh {{PLURAL:$2|ur stumm koshoc'h|stummoù koshoc'h}} eus <strong>[[:$1]]</strong> eo an enporzhiadenn-mañ.",
        "file-exists-duplicate": "Un eil eus ar {{PLURAL:$1|restr|restroù}} da-heul eo ar restr-mañ :",
        "file-deleted-duplicate": "Diverket ez eus bet c'hoazh ur restr heñvel-poch ouzh ar restr-mañ ([[:$1]]). Gwelloc'h e vefe deoc'h teuler ur sell war istor diverkadenn ar bajenn-se a-raok hec'h enporzhiañ en-dro.",
+       "file-deleted-duplicate-notitle": "Ur restr rik-heñvel ouzh homañ zo bet dilamet c'hoazh, hag an titl zo bet diverket. Gwelloc'h e vefe deoc'h gwelet gant unan bennak a c'hall gwelet roadennoù ar restroù diverket evit gwiriañ an traoù a-raok mont da adenporzhiañ anezhi.",
        "uploadwarning": "Kemenn diwall en ur ezporzhiañ",
        "uploadwarning-text": "Cheñchit deskrivadur ar restr a-is ha klaskit en-dro.",
        "savefile": "Enrollañ ar restr",
        "uploaddisabledtext": "Diweredekaet eo an enporzhiañ restroù.",
        "php-uploaddisabledtext": "Diweredekaet eo bet ar pellgargañ e PHP. Gwiriit an dibarzh arventennoù file_uploads.",
        "uploadscripted": "Er restr-mañ ez eus kodoù HTML pe skriptoù a c'hallfe bezañ kammgomprenet gant ur merdeer Kenrouedad.",
+       "upload-scripted-pi-callback": "Dibosupl eo enporzhiañ ur restr enni kemennoù plediñ gant ur follenn stil XML.",
+       "uploaded-script-svg": "Kavet ez eus bet ul elfenn skriptadus \"$1\" er restr SVG enporzhiet.",
+       "uploaded-hostile-svg": "Kavet ez eus bet ur CSS diasur en elfenn stil ur restr SVG.",
+       "uploaded-event-handler-on-svg": "N'eo ket aotreet spisaat perzhioù merañ darvoudoù <code>$1=\"$2\"</code> er restroù SVG.",
+       "uploaded-href-attribute-svg": "N'eo aotreet ar perzhioù href ere restroù SVG nemet evit liammañ ouzh palioù http:// pe https://, <code>&lt;$1 $2=\"$3\"&gt;</code> kavet.",
+       "uploaded-href-unsafe-target-svg": "Kavet ez eus bet un href war-zu roadennoù diasur er restr SVG bet enporzhiet : URI pal <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-animate-svg": "Kavet ez eus bet un dikedenn \"vevaet\" a c'hallfe cheñch an href, en ur ober gant ar perzh \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> er restr SVG enporzhiet.",
+       "uploaded-setting-event-handler-svg": "Stanket eo kefluniañ perzhioù dre ar merer darvoudoù, <code>&lt;$1 $2=\"$3\"&gt;</code> kavet er restr SVG bet enporzhiet.",
+       "uploaded-setting-href-svg": "Difennet eo ober gant an dikedenn \"set\" evit ouzhpennañ ur perzh \"href\" d'an elfenn kar.",
+       "uploaded-wrong-setting-svg": "Difennet eo ober gant an dikedenn \"set\" evit ouzhpennañ ur pal a-bell/roadenn/skript d'ur perzh bennak. Kavet eo bet <code>&lt;set to=\"$1\"&gt;</code> er restr SVG enporzhiet.",
+       "uploaded-setting-handler-svg": "Stanket eo an SVG a spisa ar perzh \"handler\" gant a-bell/roadennoù/skript. Kavet eo bet <code>$1=\"$2\"</code> er restr SVG enporzhiet.",
+       "uploaded-remote-url-svg": "Stanket eo an SVG a spisa ur perzh stil gant un URL a-bell. Kavet eo bet <code>$1=\"$2\"</code> er restr SVG enporzhiet.",
+       "uploaded-image-filter-svg": "Kavet ez eus bet ur sil skeudennoù gant un URL : <code>&lt;$1 $2=\"$3\"&gt;</code> er restr SVG enporzhiet.",
+       "uploadscriptednamespace": "Un anv esaouenn berzet zo er restr SVG \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "N'eus ket bet gallet dielfennañ an XML er restr ezporzhiet.",
        "uploadvirus": "Viruzet eo ar restr! Titouroù : $1",
        "uploadjava": "Ur restr ZIP a ra gant Java .class eo homañ.\nN'haller ket enporzhiañ restroù Java peogwir e c'haller mont dreist da vevennoù surentez ganto.",
        "upload-options": "Dibaboù kargañ",
        "watchthisupload": "Evezhiañ ar bajenn-mañ",
        "filewasdeleted": "Ur restr gant an anv-mañ zo bet enporzhiet dija ha diverket goude-se. Mat e vefe deoc'h gwiriañ an $1 a-raok hec'h enporzhiañ en-dro.",
+       "filename-thumb-name": "Tennañ a ra da ditl ur munud. Na enpotzhiit ket munudoù skeudennoù zo er wiki dija. Ma n'eo ket unan, cheñchit anv ar restr evit ma vefe splannoc'h ha na grogfe ket evel titl ur munud.",
        "filename-bad-prefix": "Anv ar restr emaoc'h oc'h enporzhiañ a grog gant '''\"$1\"''', da lavaret eo un anv dizeskrivus roet alies ent emgefre gant luc'hskeudennerezioù niverel. Dibabit un anv splannoc'h evit deskrivañ ar restr.",
        "filename-prefix-blacklist": " #<!-- lezel al linenn-mañ tre ha tre evel m'emañ --> <pre>\n# Setu penaos emañ an ereadur :\n#   * Pep tra adal un arouezenn \"#\" betek dibenn al linenn a ya d'ober un notenn\n#   * Pep linenn n'eo ket goullo zo ur rakger evit anvioù restroù heverk roet ent emgefre gant luc'hskeudennerezioù niverel\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # pellgomzerioù hezoug zo\nIMG # jenerik\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- leave this line exactly as it is -->",
        "upload-proto-error": "Protokol direizh",
        "upload-too-many-redirects": "Re a adkasoù zo en URL-mañ.",
        "upload-http-error": "Ur fazi HTTP zo bet : $1",
        "upload-copy-upload-invalid-domain": "N'haller ket seveniñ enporzhiadennoù a-bell adalek an domani-mañ.",
+       "upload-foreign-cant-upload": "N'eo ket kefluniet ar wiki-mañ evit enporzhiañ restroù d'ar c'havlec'h diellaouiñ diavaez goulennet.",
+       "upload-foreign-cant-load-config": "N'eus ket bet gallet kargañ ar c'hefluniadur enporzhiañ restroù diavaez d'ar c'havlec'h diellaouiñ.",
+       "upload-dialog-disabled": "Diweredekaet eo enporzhiañ restroù dre ar prenestr kaozeal-mañ war ar wiki-mañ.",
        "upload-dialog-title": "Kargañ ar restr",
        "upload-dialog-button-cancel": "Nullañ",
        "upload-dialog-button-back": "Kent",
        "upload-dialog-button-upload": "Enporzhiañ",
        "upload-form-label-infoform-title": "Munudoù",
        "upload-form-label-infoform-name": "Anv",
+       "upload-form-label-infoform-name-tooltip": "Un anv deskrivus nemetken evit ar restr a servijo da anv restr. Gallout a rit implijout ur yezh plaen gant esaouennoù. Arabat lakaat astenn ar restr.",
        "upload-form-label-infoform-description": "Deskrivadur",
+       "upload-form-label-infoform-description-tooltip": "Grit un tamm diverrañ eus perzhioù heverkañ al labour.\nEvit ur skeudenn, merkit ar pep pouezusañ eus ar pezh a weler, an degouezh pe al lec'h.",
        "upload-form-label-usage-title": "Implij",
        "upload-form-label-usage-filename": "Anv ar restr",
+       "upload-form-label-own-work": "Setu aze ma zammig labour din-me",
        "upload-form-label-infoform-categories": "Rummadoù",
        "upload-form-label-infoform-date": "Deiziad",
+       "upload-form-label-own-work-message-generic-local": "Kadarnaat a ran emaon oc'h enporzhiañ ar restr-mañ en ur zoujañ d'an termenoù implijout ha d'ar reolennoù perc'henniezh a dalvez war {{SITENAME}}.",
+       "upload-form-label-not-own-work-message-generic-local": "Ma n'oc'h ket gouest da enporzhiañ ar restr-mañ en ur zoujañ da reolennoù implij {{SITENAME}}, serrit ar prenestr-mañ ha klaskit un doare all.",
+       "upload-form-label-not-own-work-local-generic-local": "Gallout a ri klask gant [[Special:Upload|ar bajenn enporzhiañ dre ziouer]] ivez.",
+       "upload-form-label-own-work-message-generic-foreign": "Kompren mat a ran emaon oc'h enporzhiañ ar restr-mañ en ur c'havlec'h rannet. Kadarnaat a ran e ran se en ur zoujañ d'an termenoù servij hag ar reolennoù war ar berc'henniezh.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Ma n'oc'h ket gouest da enporzhiañ ar restr-mañ en ur zoujañ da reolennoù ar c'havlec'h rannet, serrit ar prenestr-mañ ha klaskit un doare all.",
+       "upload-form-label-not-own-work-local-generic-foreign": "Marteze hoc'h eus c'hoazh da glask en ur implijout [[Special:Upload|ar bajenn enporzhiañ war {{SITENAME}}]], ma c'hall ar restr-mañ bezañ enporzhiet eno en ur zoujañ d'o reolennoù implijout.",
        "backend-fail-stream": "Dibosupl eo lenn ar restr $1.",
        "backend-fail-backup": "Dibosupl enrollañ ar restr $1.",
        "backend-fail-notexists": "N'eus ket eus ar restr $1.",
        "backend-fail-read": "Dibosupl lenn ar restr $1.",
        "backend-fail-create": "Dibosupl eo krouiñ ar restr $1.",
        "backend-fail-maxsize": "Dibosupl skrivañ er restr $1 peogwir eo brasoc'h eget {{PLURAL:$2|un okted|$2 okted}}.",
-       "backend-fail-readonly": "Emañ an dermenell stokañ \"$1\" e mod lenn hepken. Setu aze an abeg a oa bet roet : \"$2\".",
+       "backend-fail-readonly": "Emañ an dermenell stokañ \"$1\" e mod lenn hepken. Setu aze an abeg a oa bet roet : <em>$2</em>.",
        "backend-fail-synced": "Emañ ar restr \"$1\" en ur stad direizhet en termenelloù stokañ diabarzh",
        "backend-fail-connect": "Dibosupl kevreañ ouzh termenell stokañ ar restr \"$1\".",
        "backend-fail-internal": "C'hoarvezet ez eus ur fazi dianav e termenell stokañ ar restr \"$1\".",
        "uploadstash-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",
+       "uploadstash-exception": "Dibosupl stokañ an enporzhiadenn er sanailh ($1) : \"$2\".",
        "invalid-chunk-offset": "Direizh eo offset ar rannad",
        "img-auth-accessdenied": "Moned nac'het",
        "img-auth-nopathinfo": "Mankout a ra ar PATH_INFO.\nN'eo ket kefluniet ho servijer evit reiñ an titour-mañ.\nMarteze eo diazezet war CGI ha n'hall ket skorañ img_auth.\nGwelet https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "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",
        "filerevert-submit": "Disteuler",
        "filerevert-success": "'''Distroet eo bet [[Media:$1|$1]]''' da [stumm $4 an $3, $2].",
        "filerevert-badversion": "N'eus stumm lec'hel kent ebet eus ar restr-mañ d'ar mare spisaet.",
+       "filerevert-identical": "Heñvel-mik eo stumm a-vremañ ar restr ouzh an hini zo bet diuzet.",
        "filedelete": "Diverkañ $1",
        "filedelete-legend": "Diverkañ ar restr",
        "filedelete-intro": "War-nes diverkañ '''[[Media:$1|$1]]''' a-gevret gant e istor emaoc'h.",
        "filedelete-maintenance": "Evit ar mare eo diweredekaet an diverkañ hag an assevel restroù, amzer d'ober un tamm trezalc'h.",
        "filedelete-maintenance-title": "Dibosupl diverkañ ar restr",
        "mimesearch": "Klask MIME",
-       "mimesearch-summary": "Aotren a ra ar bajenn-mañ ar silañ restroù evit ar seurt restroù MIME. Enmont : seurt/isseurt, evel <code>skeudenn/jpeg</code>.",
+       "mimesearch-summary": "Aotren a ra ar bajenn-mañ silañ restroù dre o seurt MIME. Enmont : seurt danvez/isseurt pe seurt danvez, evel <code>skeudenn/jpeg</code>.",
        "mimetype": "Seurt MIME :",
        "download": "pellgargañ",
        "unwatchedpages": "Pajennoù n'int ket evezhiet",
        "listredirects": "Roll an adkasoù",
        "listduplicatedfiles": "Roll restroù gant doublennoù",
+       "listduplicatedfiles-summary": "Hemañ zo ur roll restroù m'eo stumm diwezhañ ur restr un eilad eus stumm diwezhañ ur restr bennak all. Ne vez kemeret e kont nemet ar restroù lec'hel.",
+       "listduplicatedfiles-entry": "[[$3|{{PLURAL:$2|un doubl|$2 doubl}}]] en deus [[:File:$1|$1]].",
        "unusedtemplates": "Patromoù dizimplij",
        "unusedtemplatestext": "Rollet eo amañ an holl bajennoù zo en esaouenn anv \"{{ns:template}}\" ha n'int ket implijet war pajenn ebet. Ho pet soñj da wiriañ mat hag-eñ n'eus ket liammoù all war-du ar patromoù-se a-raok diverkañ anezho.",
        "unusedtemplateswlh": "liammoù all",
        "statistics-users-active-desc": "Implijerien o deus degaset da nebeutañ ur c'hemm {{PLURAL:$1|an deiz paseet|e-kerzh an $1 deiz diwezhañ}}",
        "pageswithprop": "Pajennoù gant ur perzh pajenn",
        "pageswithprop-legend": "Pajennoù gant ur perzh pajenn",
+       "pageswithprop-text": "Rollañ a ra ar bajenn-mañ ar pajennoù a ra gant ur perzh pajenn dibar",
        "pageswithprop-prop": "Anv ar perzh :",
        "pageswithprop-submit": "Mont",
        "pageswithprop-prophidden-long": "talvoud perzh testenn hir kuzhet ($1)",
+       "pageswithprop-prophidden-binary": "Talvoud perzh binarel kuzhet ($1)",
        "doubleredirects": "Adkasoù doubl",
        "doubleredirectstext": "Rollañ a ra ar bajenn-mañ ar pajennoù a adkas da bajennoù adkas all.\nWar bep linenn ez eus liammoù war-du pajennoù an adkas kentañ hag en eil adkas, hag ivez war-du pajenn-dal an eil adkas zo sañset bezañ ar pal \"gwirion\" a zlefe an adkas kentañ kas di.\nDiskoulmet eo bet an enmontoù <del>barrennet</del>.",
        "double-redirect-fixed-move": "Dilec'hiet eo [[$1]].\nHizivaet eo bet ent emgefre ha bremañ ez adkas da [[$2]].",
        "uncategorizedcategories": "Rummadoù dirumm",
        "uncategorizedimages": "Restroù hep rummad",
        "uncategorizedtemplates": "Patromoù hep rummad",
+       "uncategorized-categories-exceptionlist": " # Ur roll rummadoù zo ennañ na zlefent ket bezañ meneget war Special:UncategorizedCategories. Unan dre linenn, en ur gregiñ gant \"*\". Ne vez ket kemeret e kont al linennoù a grog gant un arouezenn all (zoken gant esaouennoù c'houllo). Ober gant \"#\" evit ouzhpennañ evezhiadennoù.",
        "unusedcategories": "Rummadoù dizimplij",
        "unusedimages": "Skeudennoù en o-unan",
        "wantedcategories": "Rummadoù goulennet a vank",
        "wantedpages": "Pajennoù goulennet ar muiañ",
+       "wantedpages-summary": "Roll ar pajennoù a vank, gant ar muiañ a liammoù o kas war o zu, hep kontañ ar pajennoù n'eus nemet adkasoù o kas war o zu. Evit kaout roll ar pajennoù a vank gant adkasoù o kas war o zu, sellet ouzh [[{{#special:BrokenRedirects}}|roll an adkasoù a-dreuz]].",
        "wantedpages-badtitle": "Titl direizh er strollad disoc'hoù : $1",
        "wantedfiles": "Restroù a vank",
        "wantedfiletext-cat": "Ober a reer gant ar restroù da-heul koulskoude n'eus ket anezho. Gallout a reer rollañ kavlec'hioù diavaez ha pa vefe anezho. <del>Barrennet</del> e vo an holl falspozitivoù-se. Ouzhpenn-se emañ renablet an holl bajennoù zo enno restroù n'eus ket anezho e [[:$1]].",
        "deadendpagestext": "Ar pajennoù da-heul n'int ket liammet ouzh pajenn ebet all eus {{SITENAME}}.",
        "protectedpages": "Pajennoù gwarezet",
        "protectedpages-indef": "Gwarezoù da badout hepken",
+       "protectedpages-summary": "Rollañ a ra ar bajenn-mañ ar pajennoù zo gwarezet evit ar mare. Evit kaout roll ar pajennoù n'haller ket krouiñ, sellet ouzh [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Gwarez dre skalierad hepken",
        "protectedpages-noredirect": "Kuzhat an adkasoù",
        "protectedpagesempty": "N'eus pajenn gwarezet ebet gant an arventennoù-mañ evit poent.",
        "protectedpages-unknown-timestamp": "Dianav",
        "protectedpages-unknown-performer": "Implijer dianav",
        "protectedtitles": "Titloù gwarezet",
+       "protectedtitles-summary": "Rollañ a ra ar bajenn-mañ an titloù n'haller ket implijout evit krouiñ pajennoù. Evit kaout roll ar pajennoù krouet gwarezet, sellet ouzh [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "N'eus bet gwarezet titl ebet dezhañ an arventennoù-se evit poent.",
        "protectedtitles-submit": "Diskwel an titloù",
        "listusers": "Roll an implijerien",
        "apihelp": "Skoazell an API",
        "apihelp-no-such-module": "N'eo ket bet kavet ar vodulenn \"$1\".",
        "apisandbox": "Poull-traezh API",
+       "apisandbox-jsonly": "Rekis eo JavaScript evit implijout poull-traezh an API.",
        "apisandbox-api-disabled": "Diweredekaet eo API war al lec'hienn-mañ.",
-       "apisandbox-intro": "Grit gant ar bajenn-mañ evit amprouiñ '''servij Web API MediaWiki'''.\nKit da deuler ur sell war [https://www.mediawiki.org/wiki/API:Main_page titouroù an API] evit gouzout hiroc'h war an doare da embreger API. Da skouer :\n[https://www.mediawiki.org/wiki/API#A_simple_example gwelet danvez ur bennbajenn]. Dibabit un oberiadenn bennak evit gwelet skouerioù all",
+       "apisandbox-intro": "Grit gant ar bajenn-mañ evit amprouiñ <strong>servij Web API MediaWiki</strong>.\nKit da deuler ur sell war [[mw:API:Main page|teuliadur API]] evit gouzout hiroc'h war an doare da embreger API. Da skouer :\n[https://www.mediawiki.org/wiki/API#A_simple_example gwelet danvez ur bajenn zegemer]. Dibabit un oberiadenn bennak evit gwelet skouerioù all.\n\nNotit mat : ha pa vefe ar bajenn-mañ ur poull-traezh, an oberiadennoù a rit amañ a c'hall kemmañ ar wiki.",
+       "apisandbox-fullscreen": "Dispakañ ar banell",
+       "apisandbox-fullscreen-tooltip": "Brasaat panell ar poull-traezh evit leuniañ prenestr ar merdeer.",
        "apisandbox-unfullscreen": "Diskouez ar bajenn",
+       "apisandbox-unfullscreen-tooltip": "Bihanaat panell ar poull-traezh evit ma vefe hegerz liammoù merdeiñ MediaWiki.",
        "apisandbox-submit": "Sevel ar goulenn",
        "apisandbox-reset": "Riñsañ",
        "apisandbox-retry": "Klask en-dro",
+       "apisandbox-loading": "O kargañ titouroù modulenn \"$1\" an API...",
+       "apisandbox-load-error": "C'hoarvezet ez eus ur fazi en ur gargañ modulenn \"$1\" an API : $2",
+       "apisandbox-no-parameters": "N'eus arventenn ebet d'ar vodulenn API-mañ.",
        "apisandbox-helpurls": "Liammoù skoazell",
        "apisandbox-examples": "Skouerioù",
        "apisandbox-dynamic-parameters": "Arventenn ouzhpenn",
        "apisandbox-dynamic-parameters-add-label": "Ouzhpennañ un arventenn:",
        "apisandbox-dynamic-parameters-add-placeholder": "Anv an arventenn",
+       "apisandbox-dynamic-error-exists": "Bez' ez eus c'hoazh eus un arventenn anvet \"$1\".",
+       "apisandbox-deprecated-parameters": "Arventennoù dispredet",
+       "apisandbox-fetch-token": "Leuniañ emgefre ar jedouer",
+       "apisandbox-submit-invalid-fields-title": "Direizh eo maeziennoù zo",
+       "apisandbox-submit-invalid-fields-message": "Reizhit ar maeziennoù merket ha klaskit en-dro.",
        "apisandbox-results": "Disoc'hoù",
+       "apisandbox-sending-request": "O kas ur reked API...",
+       "apisandbox-loading-results": "O resev ur reked API...",
+       "apisandbox-results-error": "C'hoarvezet ez eus ur fazi en ur gargañ respont ar reked API : $1.",
+       "apisandbox-request-selectformat-label": "Diskouez roadennoù ar reked evel :",
+       "apisandbox-request-format-url-label": "Neudennad reked an URL",
        "apisandbox-request-url-label": "Goulenn URL :",
-       "apisandbox-request-time": "Pad ar goulenn: $1",
+       "apisandbox-request-json-label": "Goulenn JSON :",
+       "apisandbox-request-time": "Pad ar goulenn : {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Reizhañ ar jedouer ha kas en-dro",
+       "apisandbox-results-fixtoken-fail": "N'eus ket bet gallet adtapout ar jedouer \"$1\".",
+       "apisandbox-alert-page": "Direizh eo maeziennoù ar bajenn-mañ.",
+       "apisandbox-alert-field": "Talvoud ar vaezienn-mañ n'eo ket reizh.",
        "apisandbox-continue": "Kenderc'hel",
        "apisandbox-continue-clear": "Riñsañ",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} a [https://www.mediawiki.org/wiki/API:Query#Continuing_queries gendalc'ho] ar reked diwezhañ ; {{int:apisandbox-continue-clear}} a ziverko an arventennoù a denn d'ar c'hendalc'h.",
+       "apisandbox-param-limit": "Merkañ <kbd>max</kbd> evit ober gant ar vevenn vrasañ.",
+       "apisandbox-multivalue-all-namespaces": "$1 (An holl esaouennoù anv)",
+       "apisandbox-multivalue-all-values": "$1 (An holl dalvoudoù)",
        "booksources": "Oberennoù dave",
        "booksources-search-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-rfc": "Pajennoù a ra gant liammoù hud RFC",
+       "magiclink-tracking-rfc-desc": "Ober a ra ar bajenn-mañ gant liammoù hud RFC. Gwelet [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] evit an doare da dreuzlec'hiañ.",
+       "magiclink-tracking-pmid": "Pajennoù a ra gant liammoù hud PMID",
+       "magiclink-tracking-pmid-desc": "Ober a ra ar bajenn-mañ gant liammoù hud PMID. Gwelet [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] evit an doare da dreuzlec'hiañ.",
+       "magiclink-tracking-isbn": "Pajennoù a ra gant liammoù burzhudus ISBN",
+       "magiclink-tracking-isbn-desc": "Ober a ra ar bajenn-mañ gant liammoù hud ISBN. Gwelet [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] evit an doare da dreuzlec'hiañ.",
        "specialloguserlabel": "Implijer :",
-       "speciallogtitlelabel": "Bukadenn (titl pe implijer) :",
+       "speciallogtitlelabel": "Pal (titl pe {{ns:user}}:anv implijer) :",
        "log": "Marilhoù",
        "logeventslist-submit": "Diskouez",
        "all-logs-page": "An holl varilhoù foran",
        "logempty": "Goullo eo istor ar bajenn-mañ.",
        "log-title-wildcard": "Klask an titloù a grog gant an destenn-mañ",
        "showhideselectedlogentries": "Diskouez/kuzhat penngerioù ar marilh bet diuzet",
+       "log-edit-tags": "Kemmañ tikedennoù an enmontoù marilh diuzet",
        "checkbox-select": "Diuzañ : $1",
        "checkbox-all": "An holl",
        "checkbox-none": "Hini ebet",
        "activeusers-intro": "Setu aze ur roll eus an implijerien zo bet oberiant mui pe vui e-pad an $1 {{PLURAL:$1|deiz|deiz}} diwezhañ.",
        "activeusers-count": "$1 {{PLURAL:$1|oberiadenn}} abaoe an {{PLURAL:$3|deiz|$3 deiz}} diwezhañ",
        "activeusers-from": "Diskouez an implijerien adal :",
+       "activeusers-groups": "Diskouez an implijerien zo ezel eus ar strolladoù :",
+       "activeusers-excludegroups": "Skarzhañ an implijerien ezel eus ar strolladoù :",
        "activeusers-noresult": "N'eus bet kavet implijer ebet.",
+       "activeusers-submit": "Diskouez an implijerien oberiant",
        "listgrouprights": "Gwirioù ar strolladoù implijer",
        "listgrouprights-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": "Gallout a ra tennañ {{PLURAL:$2|ar strollad|strolladoù}} eus kont an-unan : $1",
        "listgrouprights-addgroup-self-all": "Gallout a ra ouzhpennañ an holl strolladoù da gont an-unan",
        "listgrouprights-removegroup-self-all": "Gallout a ra tennañ kuit an holl strolladoù eus kont an-unan.",
+       "listgrouprights-namespaceprotection-header": "Strishadurioù esaouennoù anv",
        "listgrouprights-namespaceprotection-namespace": "Esaouenn anv",
        "listgrouprights-namespaceprotection-restrictedto": "Gwir(ioù) hag a aotre an implijer da aozañ",
        "listgrants": "Aotreoù",
        "trackingcategories-msg": "Rummad evezhiañ",
        "trackingcategories-name": "Anv ar gemennadenn",
        "trackingcategories-desc": "Dezverkoù evit degemer rummadoù",
+       "restricted-displaytitle-ignored": "Pajennoù gant titloù diskwel lezet a-gostez",
+       "restricted-displaytitle-ignored-desc": "Ar bajenn-mañ zo dezhi un <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> zo bet laosket a-gostez peogwir n'eo ket kevatal d'an titl zo d'ar bajenn bremañ.",
+       "noindex-category-desc": "Ar bajenn-mañ n'eo ket menegeret gant ar robotoù rak ar ger hud <code><nowiki>__NOINDEX__</nowiki></code> zo enni hag emañ en un esaouenn anv m'eo aotreet ar merkañ.",
        "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",
        "wlshowlast": "Diskouez an $1 eurvezh $2 devezh diwezhañ",
        "watchlist-hide": "Kuzhat",
        "watchlist-submit": "Diskouez",
+       "wlshowtime": "Prantad amzer war wel :",
        "wlshowhideminor": "kemmoù dister",
        "wlshowhidebots": "robotoù",
        "wlshowhideliu": "implijerien enrollet",
        "wlshowhideanons": "implijerien dizanv",
+       "wlshowhidepatr": "kemmoù gwiriet",
        "wlshowhidemine": "ma c'hemmoù",
+       "wlshowhidecategorization": "rummatadur ar bajenn",
        "watchlist-options": "Dibarzhioù ar roll evezhiañ",
        "watching": "Heuliet...",
        "unwatching": "Paouez da evezhiañ...",
        "rollbacklinkcount": "disteurel $1 {{PLURAL:$1|kemm}}",
        "rollbacklinkcount-morethan": "disteurel ouzhpenn $1 {{PLURAL:$1|kemm}}",
        "rollbackfailed": "C'hwitet eo bet an distaoladenn",
+       "rollback-missingparam": "Arventennoù rekis d'ar reked a vank.",
+       "rollback-missingrevision": "Dibosupl kargañ roadennoù ar stumm.",
        "cantrollback": "Dibosupl da zisteuler: an aozer diwezhañ eo an hini nemetañ da vezañ kemmet ar pennad-mañ",
        "alreadyrolled": "Dibosupl eo disteuler ar c'hemm diwezhañ graet d'ar bajenn [[:$1]] gant [[User:$2|$2]] ([[User talk:$2|Kaozeal]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nkemmet pe distaolet eo bet c'hoazh gant unan bennak all.\n\nAr c'hemm diwezhañ d'ar bajenn-mañ a oa bet graet gant [[User:$3|$3]] ([[User talk:$3|Kaozeal]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Diverradenn ar c'hemm a oa : <em>$1</em>.",
        "rollback-success": "Disteuler kemmoù $1; distreiñ da stumm diwezhañ $2.",
        "sessionfailure-title": "Fazi dalc'h",
        "sessionfailure": "Evit doare ez eus ur gudenn gant ho talc'h;\nNullet eo bet an ober-mañ a-benn en em wareziñ diouzh an tagadennoù preizhañ.\nKlikit war \"kent\" hag adkargit ar bajenn oc'h deuet drezi; goude klaskit en-dro.",
+       "changecontentmodel": "Cheñch patrom danvez ur bajenn",
+       "changecontentmodel-legend": "Cheñch ar patrom danvez",
        "changecontentmodel-title-label": "Anv ar bajenn",
+       "changecontentmodel-model-label": "Patrom danvez nevez",
        "changecontentmodel-reason-label": "Abeg :",
        "changecontentmodel-submit": "Kemmañ",
+       "changecontentmodel-success-title": "Cheñchet eo bet ar patrom danvez",
+       "changecontentmodel-success-text": "Kemmet eo bet patrom danvez [[:$1]].",
+       "changecontentmodel-cannot-convert": "N'hall ket danvez [[:$1]] bezañ troet en ur seurt $2.",
+       "changecontentmodel-emptymodels-title": "N'eus patrom danvez hegerz ebet",
        "logentry-contentmodel-change-revertlink": "disteuler",
        "logentry-contentmodel-change-revert": "disteuler",
        "protectlogpage": "Log_gwareziñ",
        "block-log-flags-hiddenname": "anv implijer kuzhet",
        "range_block_disabled": "Diweredekaet eo bet ar stankañ stuc'hadoù IP.",
        "ipb_expiry_invalid": "amzer termen direizh.",
+       "ipb_expiry_old": "Tremenet eo an termen echuiñ.",
        "ipb_expiry_temp": "Peurbadus e rank bezañ bloc'hadoù an implijerien guzh.",
        "ipb_hide_invalid": "Ne c'haller ket dilemel ar gont-mañ : Ouzhpenn {{PLURAL:$1|ur c'hemm|$1 kemm}} zo enni.",
        "ipb_already_blocked": "Stanket eo \"$1\" dija",
        "thumbnail-temp-create": "Dibosupl krouiñ ur restr vunut padennek",
        "thumbnail-dest-create": "Dibosupl enrollañ ar munud.",
        "thumbnail_invalid_params": "Arventennoù direizh evit ar munud",
+       "thumbnail_toobigimagearea": "Restr brasoc'h e ventoù eget $1",
        "thumbnail_dest_directory": "Dibosupl krouiñ ar c'havlec'h pal",
        "thumbnail_image-type": "N'eo ket skoret ar seurt skeudennoù",
        "thumbnail_gd-library": "Kefluniadur diglok al levraoueg GD : dibosupl kavout an arc'hwel $1",
        "import-interwiki-history": "Eilañ holl stummoù istor ar bajenn-mañ",
        "import-interwiki-templates": "Lakaat e-barzh an holl batromoù",
        "import-interwiki-submit": "Enporzhiañ",
+       "import-mapping-default": "Enporzhiañ d'al lec'hiadurioù dre ziouer",
+       "import-mapping-namespace": "Enporzhiañ d'un esaouenn anv :",
        "import-upload-filename": "Anv ar restr :",
        "import-comment": "Notenn :",
        "importtext": "Ezporzhiit ar restr adal ar wiki orin en ur ober gant an arc'hwel [[Special:Export|ezporzhiañ]].\nEnrollit ar bajenn war hoc'h urzhiataer ha kargit anezhi amañ.",
        "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",
        "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ñ.",
        "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ù",
        "patrol-log-page": "Log gwiriañ",
        "patrol-log-header": "Setu ur marilh eus ar stummoù patrouilhet.",
        "log-show-hide-patrol": "$1 istor ar stummoù gwiriet",
+       "log-show-hide-tag": "$1 marilh an dikedenn",
        "confirm-markpatrolled-button": "Mat eo",
        "deletedrevision": "Diverket stumm kozh $1.",
        "filedeleteerror-short": "Fazi e-ser diverkañ ar restr : $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ù :",
        "version-extensions": "Astennoù staliet",
        "version-skins": "Gwiskadurioù staliet",
        "version-specialpages": "Pajennoù dibar",
-       "version-parserhooks": "Galvoù dielfennañ",
+       "version-parserhooks": "Astennoù an dielfenner",
        "version-variables": "Argemmennoù",
        "version-antispam": "Mirout ouzh ar strob",
        "version-other": "Diseurt",
        "version-mediahandlers": "Merer danvez liesvedia",
-       "version-hooks": "Galvoù",
-       "version-parser-extensiontags": "Balizenn dielfennañ o tont eus an astennoù",
-       "version-parser-function-hooks": "Galv an arc'hwelioù dielfennañ",
+       "version-hooks": "Krogoù",
+       "version-parser-extensiontags": "Tikedenn astennet an dielfenner ereadurel",
+       "version-parser-function-hooks": "Arc'hwelioù astennet an dielfenner ereadurel",
        "version-hook-name": "Anv ar galv",
        "version-hook-subscribedby": "Termenet gant",
        "version-version": "($1)",
        "blankpage": "Pajenn c'houllo",
        "intentionallyblankpage": "A-ratozh e leusker gwenn ar bajenn-mañ",
        "external_image_whitelist": "  #Lezel al linenn-mañ tre evel m'emañ<pre>\n#Merkañ an tammoù bommoù reoliek (ar rann zo etre ar // nemetken) a-is\n#Klotañ a raint gant URLoù ar skeudennoù diavaez (gourliammet)\n#En em ziskwel evel skeudennoù a raio ar re a glot, evit ar re all e vo diskwelet ul liamm war-du ar skeudenn nemetken\n#Sellet e vo ouzh a linennoù a grog gant # evel ouzh notennoù\n#Kizidik eo ar roll-mañ ouzh an diforc'h etre lizherennoù bihan ha lizherennoù bras\n\n#Merkit holl rannoù ar bommoù reoliek a-us d'al linenn-mañ. Lezit al linenn ziwezhañ-mañ tre evel m'emañ</pre>",
-       "tags": "Balizennoù ar c'hemmoù reizh",
-       "tag-filter": "Silañ ar [[Special:Tags|balizennoù]] :",
+       "tags": "Tikedennoù ar c'hemmoù reizh",
+       "tag-filter": "Silañ an [[Special:Tags|tikedennoù]] :",
        "tag-filter-submit": "Silañ",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Balizenn}}]]: $2)",
-       "tags-title": "Balizennoù",
-       "tags-intro": "Rollañ a ra ar bajenn-mañ ar balizennoù a c'hall ar meziant implijout da verkañ kemmoù hag an dalvoudegezh anezho.",
-       "tags-tag": "Anv ar valizenn",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Dikedenn|Tikedenn}}]] : $2)",
+       "tag-mw-contentmodelchange": "cheñch ar patrom danvez",
+       "tags-title": "Tikedennoù",
+       "tags-intro": "Rollañ a ra ar bajenn-mañ an tikedennoù a c'hall ar meziant implijout da verkañ kemmoù hag o zalvoudegezh.",
+       "tags-tag": "Anv an dikedenn",
        "tags-display-header": "Neuz e rolloù ar c'hemmoù",
-       "tags-description-header": "Deskrivadur klok ar valizenn",
+       "tags-description-header": "Deskrivadur klok an dalvoudegezh",
        "tags-source-header": "Mammenn",
        "tags-active-header": "Oberiant ?",
        "tags-hitcount-header": "Kemmoù balizennet",
        "tags-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-manage-no-permission": "N'oc'h ket aotreet da verañ ar c'hemmañ tikedennoù.",
+       "tags-manage-blocked": "N'hallit ket merañ ar c'hemmañ tikedennoù e-keit hag {{GENDER:$1|emaoc'h}} stanket.",
        "tags-create-heading": "Krouiñ un dikedenn nevez",
        "tags-create-tag-name": "Anv an dikedenn :",
        "tags-create-reason": "Abeg :",
        "tags-create-submit": "Krouiñ",
        "tags-create-no-name": "Rekis eo merkañ anv un dikedenn.",
+       "tags-create-already-exists": "Bez' ez eus eus an tikedenn \"$1\" c'hoazh.",
+       "tags-create-warnings-below": "Kenderc'hel da grouiñ an dikedenn a fell deoc'h ?",
        "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ñ :",
        "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-thanks-title": "Trugarez !",
        "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-unknown-warning": "Kemenn diwall dianav : $1",
+       "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_html_output": "Disoc'h HTML kriz",
        "expand_templates_ok": "Mat eo",
        "expand_templates_remove_comments": "Lemel an notennoù kuit",
-       "expand_templates_remove_nowiki": "Diverkañ a ra ar balizennoù <nowiki> en disoc'h",
+       "expand_templates_remove_nowiki": "Diverkañ a ra an tikedennoù <nowiki> en disoc'h",
        "expand_templates_generate_xml": "Gwelet ar gwezennadur XML",
        "expand_templates_generate_rawhtml": "Diskouez an HTML kriz",
        "expand_templates_preview": "Rakwelet",
        "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",
        "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",
+       "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",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "Eztez diazezet war toupinoù",
+       "sessionprovider-nocookies": "Marteze eo diweredekaet an toupinoù. Bezit sur eo gweredekaet an toupinoù ha klaskit en-dro.",
        "randomrootpage": "Pajenn wrizienn dargouezhek",
        "log-action-filter-block": "Seurt bloc'had :",
+       "log-action-filter-contentmodel": "Mod kemmañ ar patrom danvez :",
+       "log-action-filter-delete": "Mod diverkañ :",
+       "log-action-filter-import": "Seurt enporzhiadur :",
+       "log-action-filter-managetags": "Mod embreger ar merañ tikedennoù :",
+       "log-action-filter-move": "Mod dilec'hiañ :",
+       "log-action-filter-newusers": "Seurt krouidigezh kont :",
+       "log-action-filter-patrol": "Mod evezhiañ :",
+       "log-action-filter-protect": "Mod gwareziñ :",
+       "log-action-filter-rights": "Mod kemmañ ar gwirioù :",
+       "log-action-filter-suppress": "Mod dilemel :",
+       "log-action-filter-upload": "Mod enporzhiañ :",
        "log-action-filter-all": "An holl",
        "log-action-filter-block-block": "Stankañ",
+       "log-action-filter-block-reblock": "Stankañ ar c'hemm",
        "log-action-filter-block-unblock": "Distankañ",
+       "log-action-filter-contentmodel-change": "Cheñch ar patrom danvez",
+       "log-action-filter-contentmodel-new": "Krouiñ pajennoù gant ur patrom danvez n'eo ket raktermenet",
+       "log-action-filter-delete-delete": "Diverkañ pajennoù",
+       "log-action-filter-delete-delete_redir": "Adkas ar frikañ",
+       "log-action-filter-delete-restore": "Diziverkañ pajennoù",
+       "log-action-filter-delete-event": "Diverkañ ar marilh",
+       "log-action-filter-delete-revision": "Diverkañ an adweladennoù",
+       "log-action-filter-import-interwiki": "Enporzh Treuzwiki",
+       "log-action-filter-import-upload": "Enporzh dre bellgarg XML",
+       "log-action-filter-managetags-create": "Krouiñ tikedenn",
+       "log-action-filter-managetags-delete": "Diverkañ tikedenn",
+       "log-action-filter-managetags-activate": "Gweredekaat tikedenn",
+       "log-action-filter-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-patrol-patrol": "Gwiriet gant an dorn",
+       "log-action-filter-patrol-autopatrol": "Gwiriet ent emgefre",
        "log-action-filter-protect-protect": "Gwarez",
+       "log-action-filter-protect-modify": "Cheñchamant er gwarez",
        "log-action-filter-protect-unprotect": "Diwarez",
+       "log-action-filter-protect-move_prot": "Gwarez dilec'hiañ",
+       "log-action-filter-rights-rights": "Cheñchamant graet gant an dorn",
        "log-action-filter-rights-autopromote": "Kemm emgefre",
+       "log-action-filter-suppress-event": "Diverkañ marilhoù",
+       "log-action-filter-suppress-revision": "Diverkañ adweladennoù",
+       "log-action-filter-suppress-delete": "Diverkañ pajennoù",
+       "log-action-filter-suppress-block": "Diverkañ implijerien dre stankadennoù",
+       "log-action-filter-suppress-reblock": "Diverkañ implijerien dre stankadennoù lies",
+       "log-action-filter-upload-upload": "Enporzhiadenn nevez",
+       "log-action-filter-upload-overwrite": "Adenporzhiañ",
+       "authmanager-authn-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-username-help": "Anv implijer evit ar gwiriekaat.",
+       "authmanager-password-help": "Ger-tremen evit ar gwiriekaat.",
+       "authmanager-domain-help": "Domani evit ar gwiriekaat diavaez.",
        "authmanager-retype-help": "Adkadarnaat ar ger-tremen.",
        "authmanager-email-label": "Postel",
        "authmanager-email-help": "Chomlec'h postel",
        "authmanager-realname-help": "Anv gwir an implijer",
        "authmanager-provider-password": "Gwiriekadur diazezet war ur ger-termen",
        "authmanager-provider-temporarypassword": "Ger-tremen da c'hortoz",
+       "authprovider-confirmlink-request-label": "Kontoù a zlefe bezañ liammet",
        "authprovider-confirmlink-success-line": "$1: bet liammet ervat.",
        "authprovider-resetpass-skip-label": "Lammat",
        "authprovider-resetpass-skip-help": "Lammat adderaouekaat ar ger-tremen.",
        "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.",
+       "authpage-cannot-link": "Dibosupl kregiñ da liammañ ar gont.",
+       "authpage-cannot-link-continue": "Dibosupl kenderc'hel da liammañ ar gont. Aet eo an eztez d'he zermen moarvat.",
        "cannotauth-not-allowed-title": "Aotre nac'het",
        "cannotauth-not-allowed": "N'oc'h ket aotreet d'ober gant ar bajenn-mañ",
+       "changecredentials": "Kemmañ an titouroù kred",
+       "changecredentials-submit": "Kemmañ an titouroù kred",
+       "changecredentials-invalidsubpage": "N'eo ket $1 ur seurt titour kred reizh.",
+       "changecredentials-success": "Cheñchet eo bet ho titouroù anaout.",
+       "removecredentials": "Lemel an titouroù kred",
+       "removecredentials-submit": "Lemel an aotreoù",
+       "removecredentials-invalidsubpage": "N'eo ket $1 ur seurt titour kred reizh.",
+       "removecredentials-success": "Lamet kuit eo bet ho titouroù anaout.",
+       "credentialsform-provider": "Seurt titouroù kred :",
        "credentialsform-account": "Anv ar gont :",
        "cannotlink-no-provider-title": "N'eus kont ebet da liammañ",
        "cannotlink-no-provider": "N'eus kont ebet da liammañ.",
        "linkaccounts-submit": "Liammañ ar c'hontoù",
        "unlinkaccounts": "Diliammañ ar c'hontoù",
        "unlinkaccounts-success": "Diliammet eo bet ar gont.",
+       "authenticationdatachange-ignored": "N'eus ket bet gallet cheñch ho roadennoù anaout. Marteze a-wac'h peogwir ne oa ket bet kefluniet pourvezer ebet.",
+       "restrictionsfield-badip": "Chomlec'h IP pe lijorenn direizh : $1",
+       "restrictionsfield-label": "Lijorennoù IP aotreet :",
+       "restrictionsfield-help": "Ur chomlec'h IP pe un esaouenn CIDR dre linenn. Evit gweredekaat pep tra, ober gant <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "Adweladenn $1",
        "pageid": "ID ar bajenn $1"
 }
index 2a3c356..fc83760 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",
        "thursday": "četvrtak",
        "friday": "petak",
        "saturday": "subota",
-       "sun": "Ned",
-       "mon": "Pon",
-       "tue": "Uto",
-       "wed": "Sri",
-       "thu": "Ä\8cet",
-       "fri": "Pet",
-       "sat": "Sub",
+       "sun": "ned",
+       "mon": "pon",
+       "tue": "uto",
+       "wed": "sri",
+       "thu": "Ä\8det",
+       "fri": "pet",
+       "sat": "sub",
        "january": "januar",
        "february": "februar",
        "march": "mart",
        "anontalk": "Razgovor",
        "navigation": "Navigacija",
        "and": "&#32;i",
-       "qbfind": "Pronađite",
+       "qbfind": "Pronađi",
        "qbbrowse": "Potraži",
        "qbedit": "Uredi",
        "qbpageoptions": "Opcije stranice",
        "searcharticle": "Idi",
        "history": "Historija stranice",
        "history_short": "Historija",
+       "history_small": "historija",
        "updatedmarker": "promjene od moje posljednje posjete",
        "printableversion": "Za štampanje",
        "permalink": "Trajni link",
        "viewdeleted_short": "Pogledaj {{PLURAL:$1|jednu obrisanu izmjenu|$1 obrisane izmjene|$1 obrisanih izmjena}}",
        "protect": "Zaštiti",
        "protect_change": "promijeni",
-       "protectthispage": "Zaštitite ovu stranicu",
+       "protectthispage": "Zaštiti ovu stranicu",
        "unprotect": "Promijeni zaštitu",
        "unprotectthispage": "Promijeni zaštitu ove stranice",
        "newpage": "Nova stranica",
        "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",
-       "imagepage": "Pogledajte stranicu datoteke",
+       "imagepage": "Pogledaj stranicu datoteke",
        "mediawikipage": "Pogledaj stranicu sa porukama",
-       "templatepage": "Pogledajte stranicu za šablone",
+       "templatepage": "Pogledaj stranicu za šablone",
        "viewhelppage": "Pogledajte stranicu za pomoć",
        "categorypage": "Pogledaj stranicu kategorije",
        "viewtalkpage": "Pogledaj razgovor",
        "redirectedfrom": "(Preusmjereno sa $1)",
        "redirectpagesub": "Preusmjerenje",
        "redirectto": "Preusmjerenje na:",
-       "lastmodifiedat": "Ova stranica je posljednji put izmijenjena u $2 na $1.",
+       "lastmodifiedat": "Ova stranica je posljednji put izmijenjena na dan $1 u $2.",
        "viewcount": "Ovoj stranici je pristupljeno {{PLURAL:$1|$1 put|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "jumpto": "Idi na:",
-       "jumptonavigation": "navigacija",
-       "jumptosearch": "traži",
+       "jumptonavigation": "navigaciju",
+       "jumptosearch": "pretragu",
        "view-pool-error": "Žao nam je, serveri su trenutno preopterećeni.\nPreviše korisnika pokušava da pregleda ovu stranicu.\nMolimo pričekajte trenutak prije nego što ponovno pokušate pristupiti ovoj stranici.\n\n$1",
        "generic-pool-error": "Nažalost, serveri su trenutno preopterećeni.\nPreviše korisnika pokušava da vidi ovaj resurs.\nMolimo pričekajte trenutak prije nego što ponovo pokušate da mu pristupite.",
        "pool-timeout": "Zaustavi čekanje na zaključavanje",
        "pool-servererror": "Usluga brojača poola nije dostupna ($1).",
        "poolcounter-usage-error": "Greška pri upotrebi: $1",
        "aboutsite": "O {{GRAMMAR:dativ|{{SITENAME}}}}",
-       "aboutpage": "Project:O_projektu_{{SITENAME}}",
+       "aboutpage": "Project:O {{GRAMMAR:dativ|{{SITENAME}}}}",
        "copyright": "Sadržaj je dostupan pod licencom $1 osim ako je navedeno drugačije.",
        "copyrightpage": "{{ns:project}}:Autorska_prava",
        "currentevents": "Novosti",
        "databaseerror-query": "Upit: $1",
        "databaseerror-function": "Funkcija: $1",
        "databaseerror-error": "Greška: $1",
-       "laggedslavemode": "'''Upozorenje''': Stranica, možda, nije ažurirana.",
+       "laggedslavemode": "<strong>Upozorenje:</strong> Moguće je da stranica nije ažurirana.",
        "readonly": "Baza je zaključana",
        "enterlockreason": "Unesite razlog za zaključavanje, uključujući procjenu vremena otključavanja",
        "readonlytext": "Baza podataka trenutno je zaključana za nove unose i druge izmjene, vjerovatno zbog rutinskog održavanja, nakon čega će biti vraćena u uobičajeno stanje.\n\nSistemski administrator koji ju je zaključao naveo je sljedeće objašnjenje: $1",
-       "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_info": "Interna greška: $1",
        "internalerror-fatal-exception": "Fatalna greška tipa \"$1\"",
-       "filecopyerror": "Ne može se kopirati \"$1\" na \"$2\".",
-       "filerenameerror": "Ne može se promjeniti ime datoteke \"$1\" u \"$2\".",
-       "filedeleteerror": "Ne može se izbrisati datoteka \"$1\".",
+       "filecopyerror": "Ne mogu kopirati datoteku \"$1\" na \"$2\".",
+       "filerenameerror": "Ne mogu preimenovati datoteku \"$1\" u \"$2\".",
+       "filedeleteerror": "Ne mogu obrisati datoteku \"$1\".",
        "directorycreateerror": "Nije moguće napraviti direktorijum \"$1\".",
        "directoryreadonlyerror": "Direktorij \"$1\" je samo za čitanje.",
        "directorynotreadableerror": "Direktorij \"$1\" nije čitljiv.",
-       "filenotfound": "Ne može se naći datoteka \"$1\".",
+       "filenotfound": "Ne mogu pronaći datoteku \"$1\".",
        "unexpected": "Neočekivana vrijednost: \"$1\"=\"$2\".",
-       "formerror": "Greška: ne može se poslati upitnik",
-       "badarticleerror": "Ova akcija ne može biti izvršena na ovoj stranici.",
-       "cannotdelete": "Ne može se obrisati stranica ili datoteka \"$1\".\nMoguće je da ju je neko već obrisao.",
-       "cannotdelete-title": "Ne mogu izbrisati stranicu \"$1\"",
+       "formerror": "Greška: ne mogu poslati upitnik.",
+       "badarticleerror": "Ova radnja se ne može izvršiti na ovoj stranici.",
+       "cannotdelete": "Ne mogu obrisati stranicu ili datoteku \"$1\".\nMoguće je da ju je neko već obrisao.",
+       "cannotdelete-title": "Ne mogu obrisati stranicu \"$1\"",
        "delete-hook-aborted": "Brisanje je prekinuo softverski priključak.\nNije ponuđeno nikakvo objašnjenje.",
        "no-null-revision": "Ne mogu napraviti novu ništavnu reviziju za stranicu \"$1\"",
        "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",
+       "userlogin": "Prijavi se / napravi račun",
        "userloginnocreate": "Prijavi se",
        "logout": "Odjavi me",
        "userlogout": "Odjavi me",
        "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.",
        "loginerror": "Greška pri prijavljivanju",
        "createacct-error": "Došlo je do greške pri otvaranju naloga",
-       "createaccounterror": "Ne može se napraviti račun: $1",
-       "nocookiesnew": "Korisnički nalog je napravljen, ali niste prijavljeni.\n{{SITENAME}} koristi kolačiće (cookies) da bi se korisnici prijavili.\nVi ste isključili kolačiće na Vašem računaru.\nMolimo Vas da ih uključite, a onda se prijavite sa svojim novim korisničkim imenom i lozinkom.",
-       "nocookieslogin": "{{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.  Vi ste onemogućili kolačiće na Vašem kompjuteru.  Molimo Vas da ih omogućite i da pokušate ponovo sa prijavom.",
+       "createaccounterror": "Ne mogu napraviti račun: $1",
+       "nocookiesnew": "Korisnički račun je napravljen, ali niste prijavljeni.\n{{SITENAME}} koristi kolačiće (cookies) za prijavu korisnika.\nVama su kolačići onemogućeni.\nOmogućite ih pa se onda prijavite s novim korisničkim imenom i lozinkom.",
+       "nocookieslogin": "{{SITENAME}} koristi kolačiće (''cookies'') za prijavu korisnika.\nVama su kolačići onemogućeni.\nOmogućite ih i pokušajte ponovo.",
        "nocookiesfornew": "Korisnički račun nije napravljen, jer nismo mogli da potvrdimo njegov izvor.\nProvjerite da li su cookies omogućeni, ponovo učitajte ovu stranicu i pokušajte ponovo.",
+       "createacct-loginerror": "Račun je uspješno napravljen, ali Vas nije bilo moguće automatski prijaviti. Prijavite se [[Special:UserLogin|ručno]].",
        "noname": "Niste izabrali ispravno korisničko ime.",
-       "loginsuccesstitle": "Prijavljen",
+       "loginsuccesstitle": "Prijava uspješna",
        "loginsuccess": "<strong>Prijavili ste se na {{GRAMMAR:akuzativ|{{SITENAME}}}} kao \"$1\".</strong>",
        "nosuchuser": "Ne postoji korisnik s imenom \"$1\".\nKorisnička imena razlikuju velika i mala slova.\nProvjerite jeste li ga tačno upisali ili [[Special:CreateAccount|otvorite novi račun]].",
        "nosuchusershort": "Ne postoji korisnik s imenom \"$1\".\nProvjerite jeste li dobro ukucali.",
        "nouserspecified": "Morate izabrati korisničko ime.",
        "login-userblocked": "Ovaj korisnik je blokiran. Prijava nije dopuštena.",
        "wrongpassword": "Lozinka koju ste unijeli je netačna.\nPokušate ponovno.",
-       "wrongpasswordempty": "Lozinka koju ste unijeli je bila prazna.\nMolimo Vas da pokušate ponovno.",
+       "wrongpasswordempty": "Niste upisali lozinku.\nPokušajte ponovo.",
        "passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
        "passwordtoolong": "Lozinke ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.",
        "passwordtoopopular": "Ovo je često korištena lozinka i ne može se koristiti. Molimo Vas da izaberete jaču lozinku.",
        "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.",
-       "emailconfirmlink": "Potvrdite Vašu e-mail adresu",
+       "emailconfirmlink": "Potvrdite svoju adresu e-pošte",
        "invalidemailaddress": "Ova e-mail adresa ne može biti prihvaćena jer je u neodgovarajućem obliku.\nMolimo vas da unesete ispravnu adresu ili ostavite prazno polje.",
        "cannotchangeemail": "Na ovom wikiju ne možete promijeniti e-mail adresu računa.",
        "emaildisabled": "Ova web-stranica ne može da šalje e-poruke.",
        "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-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.",
        "headline_sample": "Naslov",
        "headline_tip": "Podnaslov",
        "nowiki_sample": "Dodaj neformatirani tekst ovdje",
-       "nowiki_tip": "Ignoriši viki formatiranje teksta",
+       "nowiki_tip": "Zanemari wikiformatiranje",
        "image_sample": "ime_slike.jpg",
        "image_tip": "Uklopljena slika",
        "media_sample": "ime_medija_fajla.ogg",
        "media_tip": "Putanja ka multimedijalnoj datoteci",
-       "sig_tip": "Vaš potpis sa trenutnim vremenom",
+       "sig_tip": "Vaš potpis s trenutnim vremenom",
        "hr_tip": "Horizontalna linija (koristite oskudno)",
        "summary": "Sažetak:",
        "subject": "Tema:",
        "blankarticle": "<strong>Upozorenje:</strong> Napravili ste praznu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", napravit ćete praznu stranicu bez sadržaja.",
        "anoneditwarning": "<strong>Upozorenje:</strong> Niste prijavljeni. \nVaša IP adresa će biti javno vidljiva ako napravite neku izmjenu. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 napravite račun]</strong>, vaše izmjene će biti pripisane vašem korisničkom imenu, zajedno sa drugim pogodnostima.",
        "anonpreviewwarning": "''Niste prijavljeni. Nakon spremanja izmjena vaša IP adresa će biti zapisana u historiji uređivanja ove stranice.''",
-       "missingsummary": "'''Napomena:''' Niste unijeli sažetak izmjene.\nAko kliknete na Sačuvaj, Vaša izmjena će biti sačuvana bez sažetka.",
+       "missingsummary": "<strong>Napomena:</strong> Niste unijeli sažetak izmjene.\nAko ponovo kliknete na \"{{int:savearticle}}\", Vaša izmjena će biti sačuvana bez sažetka.",
        "selfredirect": "<strong>Upozorenje:</strong> Preusmjerili ste stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", ipak će nastati preusmjerenje.",
-       "missingcommenttext": "Molimo unesite komentar ispod.",
+       "missingcommenttext": "Unesite komentar ispod.",
        "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali temu za ovaj komentar.\nAko ponovo kliknete na \"{{int:savearticle}}\", vaša izmjena će biti sačuvana bez teme/naslova.",
        "summary-preview": "Pregled sažetka:",
        "subject-preview": "Pregled teme:",
        "autoblockedtext": "Vaša IP-adresa automatski je blokirana jer ju je koristio drugi korisnik, a blokirao ju je $1.\nNaveden je sljedeći razlog:\n\n:''$2''\n\n* Početak blokade: $8\n* Kraj blokade: $6\n* Blokirani korisnik: $7\n\nMožete kontaktirati sa $1 ili nekim drugim iz grupe [[{{MediaWiki:Grouppage-sysop}}|administratora]] i zahtijevati da Vas deblokira.\n\nZapamtite da ne možete koristiti opciju \"pošalji e-mail ovom korisniku\" sve dok ne unesete validnu e-mail adresu pri registraciji u Vašim [[Special:Preferences|korisničkim postavkama]] i dok niste spriječeni (blokadom) da je koristite.\n\nVaša trenutna IP-adresa je $3, a ID blokade je $5.\nMolimo da navedete sve gore navedene detalje u zahtjevu za deblokadu.",
        "blockednoreason": "razlog nije naveden",
        "whitelistedittext": "Morate biti $1 da biste uređivali stranice.",
-       "confirmedittext": "Morate potvrditi Vašu e-mail adresu prije nego počnete mijenjati stranice.\nMolimo da postavite i verifikujete Vašu e-mail adresu putem Vaših [[Special:Preferences|korisničkih opcija]].",
+       "confirmedittext": "Morate potvrditi svoju adresu e-pošte prije nego počnete mijenjati stranice.\nPostavite i potvrdite svoju adresu e-pošte u [[Special:Preferences|korisničkim postavkama]].",
        "nosuchsectiontitle": "Ne mogu pronaći sekciju",
        "nosuchsectiontext": "Pokušali ste uređivati sekciju koja ne postoji.\nMožda je premještena ili obrisana dok ste pregledavali stranicu.",
        "loginreqtitle": "Potrebna je prijava",
        "loginreqlink": "prijavljeni",
        "loginreqpagetext": "Morate biti $1 da biste vidjeli druge stranice.",
        "accmailtitle": "Šifra poslana.",
-       "accmailtext": "Nasumično odabrana šifra za [[User talk:$1|$1]] je poslata na adresu $2.\n\nŠifra/lozinka za ovaj novi račun može biti promijenjena na stranici ''[[Special:ChangePassword|izmjene šifre]]'' nakon prijave.",
+       "accmailtext": "Nasumično odabrana lozinka za [[User talk:$1|$1]] poslana je na $2. Lozinka se <em>[[Special:ChangePassword|može promijeniti]]</em> nakon prijave.",
        "newarticle": "(Novi)",
        "newarticletext": "Došli ste na stranicu koja još nema sadržaja.\n*Ako želite unijeti sadržaj, počnite tipkati u prozor ispod ovog teksta.\n*Ako Vam treba pomoć, idite na [$1 stranicu za pomoć].\n*Ako ste ovamo dospjeli slučajno, kliknite na dugme \"Nazad\" (''Back'') u Vašem internetskom pregledniku.",
        "anontalkpagetext": "----\n<em>Ovo je stranica za razgovor s anonimnim korisnikom koji još nije napravio račun ili ga ne koristi.</em>\nZbog toga moramo koristiti brojčanu IP-adresu kako bismo ga prepoznali.\nTakvu adresu može dijeliti više korisnika.\nAko ste anonimni korisnik i smatrate da su Vam upućene nebitne primjedbe, molimo Vas da [[Special:CreateAccount|napravite račun]] ili se [[Special:UserLogin|prijavite]] da biste izbjegli buduću zabunu s ostalim anonimnim korisnicima.",
        "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": "<strong>Napomena:</strong> Nakon što sačuvate izmjene, možda ćete morati osvježiti keš preglednika da biste vidjeli izmjene.\n* <strong>Firefox / Safari:</strong> Držite <em>Shift</em> i kliknite na <em>Reload</em> ili pritisnite <em>Ctrl-F5</em> ili <em>Ctrl-R</em> (<em>⌘-R</em> na Macu)\n* <strong>Google Chrome:</strong> Pritisnite <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> na Macu)\n* <strong>Internet Explorer:</strong> Držite <em>Ctrl</em> i kliknite na <em>Refresh</em> ili pritisnite <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Idite na <em>Menu → Settings</em> (<em>Opera → Preferences</em> na Macu) i zatim <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Pažnja:''' Koristite dugme \"{{int:showpreview}}\" da testirate svoj novi CSS prije nego što sačuvate.",
        "userjsyoucanpreview": "'''Pažnja:''' Koristite dugme \"{{int:showpreview}}\" da testirate svoj novi JavaScript prije nego što sačuvate.",
-       "usercsspreview": "'''Zapamtite ovo je samo izgled Vašeg CSS-a.'''\n'''Ovaj pregled još uvijek nije sačuvan!'''",
-       "userjspreview": "'''Zapamtite ovo je samo izgled vaše JavaScript-e, još uvijek nije sačuvan!'''",
+       "usercsspreview": "<strong>Zapamtite da je ovo samo pregled Vašeg CSS-a.\nStranica još nije sačuvana!</strong>",
+       "userjspreview": "<strong>Zapamtite da je ovo samo pregled Vašeg JavaScripta.\nStranica još nije sačuvana!</strong>",
        "sitecsspreview": "'''Zapamtite ovo je samo izgled ovog CSS-a.'''\n'''Još uvijek nije sačuvan!'''",
        "sitejspreview": "'''Zapamtite ovo je samo izgled ovog koda JavaScripte.'''\n'''Još uvijek nije sačuvan!'''",
-       "userinvalidcssjstitle": "'''Upozorenje:''' Ne postoji interfejs pod imenom \"$1\".\nNe zaboravite da imena stranica s .css i .js kodom počinju malim slovom, npr, {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
+       "userinvalidcssjstitle": "<strong>Upozorenje:</strong> Ne postoji tema \"$1\".\nNe zaboravite da imena stranica s .css i .js kodom počinju malim slovom, npr, {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
        "updated": "(Osvježeno)",
        "note": "'''Pažnja:'''",
        "previewnote": "<strong>Ne zaboravite da je ovo samo pregled.</strong>\nVaše izmjene još nisu sačuvane!",
        "continue-editing": "Idi na područje uređivanja",
-       "previewconflict": "Ovaj pregled prikazuje kako će tekst u gornjem polju\nizgledati ako kliknete \"Sačuvaj članak\".",
+       "previewconflict": "Ovaj pregled prikazuje kako će tekst u gornjem polju izgledati ako odlučite sačuvati stranicu.",
        "session_fail_preview": "Izvinjavamo se! Nismo mogli obraditi Vašu izmjenu zbog gubitka podataka o prijavi.\n\nMožda ste odjavljeni. <strong>Provjerite jeste li prijavljeni i pokušajte ponovo</strong>.\nAko i dalje ne radi, pokušajte se [[Special:UserLogout|odjaviti]] i ponovo prijaviti i provjerite dozvoljava li Vaš preglednik kolačiće s ovog sajta.",
        "session_fail_preview_html": "'''Žao nam je! Nismo mogli da obradimo vašu izmjenu zbog gubitka podataka.'''\n\n''Zbog toga što {{SITENAME}} ima omogućen izvorni HTML, predpregled je sakriven kao predostrožnost protiv JavaScript napada.''\n\n'''Ako ste pokušali da napravite pravu izmjenu, molimo pokušajte ponovo. Ako i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo prijavite.'''",
        "token_suffix_mismatch": "'''Vaša izmjena nije prihvaćena jer je Vaš web preglednik ubacio znakove interpunkcije u token uređivanja.\nIzmjena je odbačena da bi se spriječilo uništavanje teksta stranice.\nTo se događa ponekad kad korisite problematični anonimni proxy koji je baziran na web-u.'''",
        "editing": "Uređujete $1",
        "creating": "Pravljenje stranice $1",
        "editingsection": "Uređujete $1 (dio)",
-       "editingcomment": "Uređujete $1 (nova sekcija)",
+       "editingcomment": "Uređujete $1 (novi odlomak)",
        "editconflict": "Sukob izmjena: $1",
        "explainconflict": "Neko drugi je promijenio ovu stranicu otkad ste je Vi počeli mijenjati.\nGornje tekstualno polje sadrži tekst stranice koji trenutno postoji.\nVaše izmjene prikazane su u donjem tekstu.\nMorat ćete unijeti svoje promjene u postojeći tekst.\n'''Samo''' tekst u gornjem tekstualnom polju bit će sačuvan kad\nkliknete \"{{int:savearticle}}\".",
        "yourtext": "Vaš tekst",
        "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>.",
        "nextrevision": "Novija izmjena →",
        "currentrevisionlink": "Trenutna verzija",
        "cur": "tren",
-       "next": "slijed",
+       "next": "sljed",
        "last": "preth",
        "page_first": "prva",
        "page_last": "posljednja",
-       "histlegend": "Odabir razlika: označite radio dugme verzija koje uspoređujete i pritistnite enter ili dugme na dnu. <br />\nObjašnjenje: '''(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",
        "historysize": "({{PLURAL:$1|1 bajt|$1 bajta|$1 bajtova}})",
        "historyempty": "(prazno)",
        "history-feed-title": "Historija izmjena",
-       "history-feed-description": "Historija promjena ove stranice na wikiju",
+       "history-feed-description": "Historija izmjena ove stranice na wikiju",
        "history-feed-item-nocomment": "$1 u $2",
-       "history-feed-empty": "Tražena stranica ne postoji.\nMoguće da je 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:",
        "prefs-watchlist-edits": "Najveći broj izmjena za prikaz u proširenom spisku praćenja:",
        "prefs-watchlist-edits-max": "Najveći broj: 1000",
        "prefs-watchlist-token": "Žeton praćenih članaka:",
-       "prefs-misc": "Ostala podešavanja",
+       "prefs-misc": "Razno",
        "prefs-resetpass": "Promijeni lozinku",
        "prefs-changeemail": "Promijeni ili ukloni adresu e-pošte",
        "prefs-setemail": "Postavite e-mail adresu",
        "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.",
-       "email": "E-mail",
+       "email": "E-pošta",
        "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje vašem radu.",
        "prefs-help-email": "Adresa e-pošte nije obavezna, ali je potrebna u slučaju ponovnog postavljanja šifre, ako je zaboravite.",
        "prefs-help-email-others": "Također možete dopustiti drugim korisnicima da vas kontaktiraju preko linka na lijevoj strani vaše stranice ili stranice za razgovor.\nVaša adresa e-pošte neće biti prikazana drugim korisnicima koji vas kontaktiraju.",
        "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-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.",
        "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-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",
        "unknown-error": "Desila se nepoznata greška.",
        "tmp-create-error": "Nije moguće napraviti privremenu datoteku.",
        "tmp-write-error": "Greška pri pisanju privremene datoteke.",
-       "large-file": "Preporučeno je da datoteke nisu veće od $1;\nOva datoteka je velika $2.",
+       "large-file": "Preporučeno je da datoteke ne budu veće od $1;\nova datoteka je velika $2.",
        "largefileserver": "Ova datoteka je veća nego što je dozvoljeno u postavkama servera.",
        "emptyfile": "Datoteka koju ste poslali je prazna. Ovo je moguće zbog greške u imenu datoteke. Molimo Vas da provjerite da li stvarno želite da pošaljete ovu datoteku.",
        "windows-nonascii-filename": "Ova wiki ne podržava imena datoteka sa posebnim znacima.",
        "uploadwarning": "Upozorenje pri postavljanju",
        "uploadwarning-text": "Molimo izmijeniti opis datoteke ispod i pokušajte kasnije.",
        "savefile": "Sačuvaj datoteku",
-       "uploaddisabled": "Slanje fajlova je isključeno",
+       "uploaddisabled": "Postavljanje datoteka je onemogućeno.",
        "copyuploaddisabled": "Postavljanje putem URL nije omogućeno.",
        "uploaddisabledtext": "Postavljanje datoteka je onemogućeno.",
        "php-uploaddisabledtext": "Postavljanje datoteka preko PHP je onemogućeno. Molimo provjerite postavku file_uploads.",
        "uploaded-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.",
        "listduplicatedfiles": "Spisak duplih datoteka",
        "listduplicatedfiles-summary": "Ovo je spisak datoteka koje su duplikat nekih drugih datoteka. Prikazane su samo lokalne datoteke.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] ima [[$3|{{PLURAL:$2|jedan duplikat|$2 duplikata}}]].",
-       "unusedtemplates": "Nekorišteni šabloni",
+       "unusedtemplates": "Neiskorišteni šabloni",
        "unusedtemplatestext": "Ova stranica prikazuje sve stranice u imenskom prostoru {{ns:template}} koji se ne koriste.\nPrije brisanja provjerite da li druge stranice vode na te šablone.",
        "unusedtemplateswlh": "ostali linkovi",
        "randompage": "Slučajna stranica",
        "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",
        "brokenredirectstext": "Sljedeća preusmjerenja vode na nepostojeće stranice:",
        "brokenredirects-edit": "uredi",
        "brokenredirects-delete": "obriši",
-       "withoutinterwiki": "Članci bez interwiki linkova",
+       "withoutinterwiki": "Stranice bez jezičkih linkova",
        "withoutinterwiki-summary": "Slijedeće stranice nemaju linkove prema verzijama na drugim jezicima.",
        "withoutinterwiki-legend": "Prefiks",
        "withoutinterwiki-submit": "Prikaži",
-       "fewestrevisions": "Stranice sa najmanje izmjena",
+       "fewestrevisions": "Stranice s najmanje izmjena",
        "nbytes": "$1 {{PLURAL:$1|bajt|bajta|bajtova}}",
-       "ncategories": "$1 {{PLURAL:$1|kategorija|kategorije}}",
+       "ncategories": "$1 {{PLURAL:$1|kategorija|kategorije|kategorija}}",
        "ninterwikis": "$1 {{PLURAL:$1|međujezična veza|međujezične veze}}",
-       "nlinks": "$1 {{PLURAL:$1|veza|veze}}",
-       "nmembers": "$1 {{PLURAL:$1|član|članova}}",
+       "nlinks": "$1 {{PLURAL:$1|linka|linka|linkova}}",
+       "nmembers": "$1 {{PLURAL:$1|član|člana|članova}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|član|člana|članova}}",
        "nrevisions": "$1 {{PLURAL:$1|verzija|verzije|verzija}}",
        "nimagelinks": "Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "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}}.",
-       "uncategorizedpages": "Nekategorisane stranice",
-       "uncategorizedcategories": "Nekategorisane kategorije",
-       "uncategorizedimages": "Slike bez kategorije",
-       "uncategorizedtemplates": "Šabloni bez kategorije",
+       "lonelypagestext": "Sljedeće stranice nisu povezane niti su uključene transkluzijom u druge stranice na {{GRAMMAR:dativ|{{SITENAME}}}}.",
+       "uncategorizedpages": "Nekategorizirane stranice",
+       "uncategorizedcategories": "Nekategorizirane kategorije",
+       "uncategorizedimages": "Nekategorizirane datoteke",
+       "uncategorizedtemplates": "Nekategorizirani šabloni",
        "unusedcategories": "Neiskorištene kategorije",
        "unusedimages": "Nekorištene slike",
        "wantedcategories": "Tražene kategorije",
-       "wantedpages": "Najpotrebnije stranice",
+       "wantedpages": "Tražene stranice",
        "wantedpages-summary": "Spisak nepostojećih stranica sa najviše veza ka njima. Na spisku se ne nalaze stranice do kojih vode preusmjerenja. Za spisak nepostojećih stranica na koje su povezana preumsjerenja, pogledajte [[{{#special:BrokenRedirects}}|spisak pokvarenih preusmerenja]].",
        "wantedpages-badtitle": "Nevaljan naslov u setu rezultata: $1",
        "wantedfiles": "Tražene datoteke",
-       "wantedfiletext-cat": "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",
-       "mostlinkedcategories": "Kategorije sa najviše linkova",
+       "wantedtemplates": "Traženi šabloni",
+       "mostlinked": "Stranice s najviše linkova",
+       "mostlinkedcategories": "Kategorije s najviše linkova",
        "mostlinkedtemplates": "Najviše uključene stranice",
-       "mostcategories": "Članci sa najviše kategorija",
+       "mostcategories": "Stranice s najviše kategorija",
        "mostimages": "Datoteke s najviše veza",
        "mostinterwikis": "Stranice sa najviše međuwikija",
-       "mostrevisions": "Članci sa najviše izmjena",
-       "prefixindex": "Sve stranice sa prefiksom",
+       "mostrevisions": "Stranice s najviše izmjena",
+       "prefixindex": "Sve stranice s prefiksom",
        "prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)",
        "prefixindex-submit": "Prikaži",
        "prefixindex-strip": "Sakrij prefiks u spisku",
        "shortpages": "Kratke stranice",
-       "longpages": "Dugačke stranice",
-       "deadendpages": "Stranice bez unutrašnjih veza",
-       "deadendpagestext": "Slijedeće stranice nisu povezane s drugim stranicama na {{SITENAME}}.",
+       "longpages": "Duge stranice",
+       "deadendpages": "Stranice bez unutrašnjih linkova",
+       "deadendpagestext": "Sljedeće stranice nisu povezane s drugim stranicama na {{GRAMMAR:dativ|{{SITENAME}}}}.",
        "protectedpages": "Zaštićene stranice",
        "protectedpages-indef": "Samo neograničena zaštićenja",
        "protectedpages-summary": "Na ovoj stranici se nalazi spisak trenutno zaštićenih stranica. Za spisak zaštićenih naslova vidi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "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",
        "cachedspecial-refresh-now": "Pogledaj najnoviju.",
        "categories": "Kategorije",
        "categories-submit": "Prikaži",
-       "categoriespagetext": "{{PLURAL:$1|Slijedeća kategorija sadrži|Slijedeće kategorije sadrže}} stranice ili multimedijalne datoteke.\n[[Special:UnusedCategories|Nekorištene kategorije]] nisu prikazane ovdje.\nVidi također [[Special:WantedCategories|zatražene kategorije]].",
+       "categoriespagetext": "{{PLURAL:$1|Sljedeća kategorija sadrži|Sljedeće kategorije sadrže}} stranice ili multimedijalne datoteke.\n[[Special:UnusedCategories|Nekorištene kategorije]] nisu prikazane ovdje.\nTakođer pogledajte [[Special:WantedCategories|zatražene kategorije]].",
        "categoriesfrom": "Prikaži kategorije počev od:",
-       "deletedcontributions": "Obrisani doprinosi korisnika",
+       "deletedcontributions": "Obrisani korisnički doprinosi",
        "deletedcontributions-title": "Obrisani doprinosi korisnika",
        "sp-deletedcontributions-contribs": "doprinosi",
        "linksearch": "Pretraga vanjskih linkova",
        "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.",
-       "trackingcategories": "Praćenje kategorija",
+       "listgrants-grant": "Dozvola",
+       "listgrants-rights": "Prava",
+       "trackingcategories": "Kategorije za praćenje",
        "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",
        "trackingcategories-name": "Ime poruke",
        "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",
        "mywatchlist": "Spisak praćenja",
        "watchlistfor2": "Za $1 $2",
        "nowatchlist": "Nemate ništa na svom spisku praćenih članaka.",
-       "watchlistanontext": "Morate biti prijavljeni kako biste vidjeli ili uređivali svoj spisak praćenih članaka.",
+       "watchlistanontext": "Morate biti prijavljeni da biste vidjeli ili uređivali svoj spisak praćenih članaka.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisak praćenja",
        "addedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor dodani su na Vaš [[Special:Watchlist|spisak praćenja]].",
        "removedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor uklonjeni su s Vašeg [[Special:Watchlist|spiska praćenja]].",
        "removedwatchtext-talk": "\"[[:$1]]\" i njoj pridružena stranica uklonjene su s Vašeg [[Special:Watchlist|spiska praćenja]].",
        "removedwatchtext-short": "Stranica \"$1\" je uklonjena sa vašeg spiska praćenja.",
-       "watch": "Prati članak",
+       "watch": "Prati",
        "watchthispage": "Prati ovu stranicu",
        "unwatch": "Prestani pratiti",
        "unwatchthispage": "Prestani pratiti",
-       "notanarticle": "Nije članak",
-       "notvisiblerev": "Revizija je obrisana",
+       "notanarticle": "Nije stranica sa sadržajem",
+       "notvisiblerev": "Obrisana je posljednja izmjena drugog korisnika",
        "watchlist-details": "Imate {{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} na Vašem spisku praćenja, ne računajući posebno stranice za razgovor.",
        "wlheader-enotif": "Uključeno je obavještenje e-poštom.",
        "wlheader-showupdated": "Stranice koje su izmijenjene otkad ste ih posljednji put posjetili prikazane su <strong>podebljanim slovima</strong>.",
-       "wlnote": "Ispod {{PLURAL:$1|je najskorija izmjena|su <strong>$1</strong> najskorije izmjene|<strong>$1</strong> najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih <strong>$2</strong> sata|u posljednjih <strong>$2</strong> sati}}, od $3, $4.",
+       "wlnote": "Ispod {{PLURAL:$1|je posljednja izmjena|su <strong>$1</strong> posljednje izmjene|su <strong>$1</strong> posljednjih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih <strong>$2</strong> sata|u posljednjih <strong>$2</strong> sati}}, od $3, $4.",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlist-hide": "Sakrij",
        "watchlist-submit": "Prikaži",
        "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...",
        "enotif_anon_editor": "anonimni korisnik $1",
        "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\ne-pošta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osim ako prijavljeni ponovno posjetite stranicu. Također možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\nVaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki email obavijesti, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjenu postavki vašeg praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa obrišete stranicu sa vašeg spiska praćenja, posjetite\n$UNWATCHURL\n\nPovratne informacije i daljnja pomoć:\n$HELPPAGE",
        "created": "napravljena",
-       "changed": "promijenjena",
+       "changed": "izmijenjena",
        "deletepage": "Obriši stranicu",
-       "confirm": "Potvrdite",
+       "confirm": "Potvrdi",
        "excontent": "sadržaj je bio: \"$1\"",
        "excontentauthor": "sadržaj je bio: \"$1\", a jedini urednik \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|razgovor]])",
        "exbeforeblank": "sadržaj prije brisanja je bio: \"$1\"",
        "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]]",
        "undeletepagetext": "{{PLURAL:$1|Slijedeća $1 stranica je obrisana|Slijedeće $1 stranice su obrisane|Slijedećih $1 je obrisano}} ali su još uvijek u arhivi i mogu biti vraćene.\nArhiva moše biti periodično čišćena.",
        "undelete-fieldset-title": "Vraćanje izmjena",
        "undeleteextrahelp": "Da biste vratili cijelu historiju stranice, ostavite sve kućice neoznačene i kliknite na <strong><em>{{int:undeletebtn}}</em></strong>.\nDa biste vratili određene izmjene, označite ih i kliknite na <strong><em>{{int:undeletebtn}}</em></strong>.",
-       "undeleterevisions": "$1 {{PLURAL:$1|izmjena je obrisana|izmjena je obrisano}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|izmjena je obrisana|izmjene su obrisane|izmjena je obrisano}}",
        "undeletehistory": "Ako vratite stranicu, sve će izmjene biti vraćene u njenu historiju.\nAko je u međuvremenu napravljena nova izmjena s istim nazivom, vraćene izmjene pojavit će se u njenoj ranijoj historiji.",
        "undeleterevdel": "Vraćanje neće biti izvršeno ako je rezultat toga djelomično brisanje posljednje izmjene.\nU takvim slučajevima morate isključiti ili otkriti najnoviju obrisanu izmjenu.",
        "undeletehistorynoadmin": "Ova stranica je obrisana.\nRazlog za brisanje se nalazi ispod, zajedno s detaljima o korisniku koji je mijenjao stranicu prije brisanja.\nTekst obrisanih verzija dostupan je samo administratorima.",
        "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",
        "namespace_association": "Povezan imenski prostor",
        "tooltip-namespace_association": "Označite ovu kutiju da također uključite razgovor ili imenski prostor teme koja je povezana sa odabranim imenskim prostorom",
        "blanknamespace": "(glavni)",
-       "contributions": "Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}",
+       "contributions": "{{GENDER:$1|Korisnički}} doprinosi",
        "contributions-title": "Doprinosi korisnika $1",
        "mycontris": "Doprinosi",
        "anoncontribs": "Doprinosi",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
-       "contributions-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
-       "nocontribs": "Nisu nađene promjene koje zadovoljavaju ove uslove.",
+       "contributions-userdoesnotexist": "Korisnički račun \"$1\" nije registriran.",
+       "nocontribs": "Nema izmjena koje odgovaraju navedenim kriterijima.",
        "uctop": "(trenutno)",
        "month": "Od mjeseca (i ranije):",
        "year": "Od godine (i ranije):",
        "whatlinkshere": "Šta vodi ovamo",
        "whatlinkshere-title": "Stranice koje vode na \"$1\"",
        "whatlinkshere-page": "Stranica:",
-       "linkshere": "Sljedeći članci vode na '''[[:$1]]''':",
+       "linkshere": "Sljedeće stranice vode na <strong>[[:$1]]</strong>:",
        "nolinkshere": "Nijedna stranica nije povezana sa <strong>[[:$1]]</strong>.",
        "nolinkshere-ns": "Nijedna stranica nije povezana sa <strong>[[:$1]]</strong> u izabranom imenskom prostoru.",
        "isredirect": "preusmjerenje",
-       "istemplate": "šablon",
+       "istemplate": "uključivanje",
        "isimage": "veza na datoteku",
        "whatlinkshere-prev": "{{PLURAL:$1|prethodni|prethodna|prethodnih}} $1",
        "whatlinkshere-next": "{{PLURAL:$1|sljedeći|sljedeća|sljedećih}} $1",
        "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:",
        "unblock-hideuser": "Ne možete deblokirati ovog korisnika jer je njegovo korisničko ime sakriveno.",
        "ipb_cant_unblock": "Greška: Blokirani ID $1 nije pronađen. Možda je korisnik već deblokiran.",
        "ipb_blocked_as_range": "Greška: IP adresa $1 nije direktno blokirana i ne može se deblokirati.\nMeđutim, možda je blokirana kao dio bloka $2, koji se ne može deblokirati.",
-       "ip_range_invalid": "Netačan raspon IP adresa.",
+       "ip_range_invalid": "Netačan opseg IP-adresa.",
        "ip_range_toolarge": "Nisu dopuštene blokade veće od /$1.",
        "proxyblocker": "Zaštita od proxya",
        "proxyblockreason": "Vaša IP adresa je blokirana jer je ona otvoreni proxy.\nMolimo vas da kontaktirate vašeg davatelja internetskih usluga ili tehničku podršku i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.",
        "cant-see-hidden-user": "Korisnik kojeg pokušavate blokirati je već blokiran i sakriven. Pošto nemate prava hideuser (sakrivanje korisnika), ne možete vidjeti ni urediti korisnikovu blokadu.",
        "ipbblocked": "Ne možete blokirati ili deblokirati druge korisnike, jer ste i sami blokirani",
        "ipbnounblockself": "Nije Vam dopušteno da deblokirate samog sebe",
-       "lockdb": "Zaključajte bazu",
-       "unlockdb": "Otključaj bazu",
-       "lockdbtext": "Zaključavanje baze će svim korisnicima ukinuti mogućnost izmjene stranica,\npromjene korisničkih podešavanja, izmjene praćenih članaka, i svega ostalog\nšto zahtjeva promjene u bazi.\nMolimo Vas da potvrdite da je ovo zaista ono što namjeravate da uradite, i da ćete\notkučati bazu kad završite posao oko njenog održavanja.",
+       "lockdb": "Zaključavanje baze podataka",
+       "unlockdb": "Otključavanje baze podataka",
+       "lockdbtext": "Zaključavanje baze će svim korisnicima ukinuti mogućnost izmjene stranica,\nkorisničkih postavki, praćenih članaka i svega ostalog\nšto zahtijeva izmjenu u bazi.\nPotvrdite da je ovo zaista ono što namjeravate uraditi i da ćete\notkučati bazu kad završite posao oko njenog održavanja.",
        "unlockdbtext": "Otključavanje baze će svim korisnicima vratiti mogućnost\nizmjene stranica, promjene korisničkih stranica, izmjene spiska praćenih članaka,\ni svega ostalog što zahtjeva promjene u bazi.\nMolimo Vas da potvrdite da je ovo zaista ono što namijeravate da uradite.",
-       "lockconfirm": "Da, zaista želim da zaključam bazu.",
-       "unlockconfirm": "Da, zaista želim da otključam bazu.",
-       "lockbtn": "Zaključajte bazu",
+       "lockconfirm": "Da, zaista želim zaključati bazu.",
+       "unlockconfirm": "Da, zaista želim otključati bazu.",
+       "lockbtn": "Zaključaj bazu",
        "unlockbtn": "Otključaj bazu",
        "locknoconfirm": "Niste potvrdili svoju namjeru.",
        "lockdbsuccesssub": "Baza je zaključana",
        "unlockdbsuccesssub": "Baza je otključana",
-       "lockdbsuccesstext": "{{SITENAME}} baza podataka je zaključana. <br /> Sjetite se da je otključate kad završite sa održavanjem.",
+       "lockdbsuccesstext": "Baza podataka je zaključana.<br />\nNe zaboravite je [[Special:UnlockDB|otključati]] nakon što završite s održavanjem.",
        "unlockdbsuccesstext": "{{SITENAME}} baza podataka je otključana.",
        "lockfilenotwritable": "Datoteka zaključavanja baze je zaštićena za pisanje.\nAko želite otključati ili zaključati bazu, ova datoteka mora biti omogućena za pisanje od strane web servera.",
        "databasenotlocked": "Baza podataka nije zaključana.",
        "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",
+       "export": "Izvoz stranica",
        "exporttext": "Možete izvesti tekst i historiju jedne ili više stranica uklopljene u XML kod.\nOvo se može uvesti u drugi wiki koristeći MediaWiki preko [[Special:Import|stranice uvoza]].\n\nZa izvoz stranica unesite njihove naslove u polje ispod, jedan naslov po retku, i označite želite li trenutnu verziju zajedno sa svim ranijim, ili samo trenutnu verziju sa informacijom o zadnjoj promjeni.\n\nU drugom slučaju možete koristiti i vezu, npr. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za stranicu [[{{MediaWiki:Mainpage}}]].",
        "exportall": "Izvezi sve stranice",
-       "exportcuronly": "Uključite samo trenutnu reviziju, ne cijelu historiju",
+       "exportcuronly": "Uključi samo trenutnu verziju, ne cijelu historiju",
        "exportnohistory": "----\n'''Pažnja:''' Izvoz cjelokupne historije stranica preko ovog obrasca je onemogućeno iz tehničkih razloga.",
        "exportlistauthors": "Uključi cjelokupan spisak doprinosilaca za svaku stranicu",
        "export-submit": "Izvezi",
        "export-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",
+       "allmessagesdefault": "Predodređeni tekst",
        "allmessagescurrent": "Trenutni tekst",
-       "allmessagestext": "Ovo je spisak svih sistemskih poruka u dostupnih u MediaWiki imenskom prostoru.\nMolimo posjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki lokalizaciju] i [https://translatewiki.net translatewiki.net] ako želite doprinijeti općoj lokalizaciji MediaWikija.",
+       "allmessagestext": "Ovo je spisak svih sistemskih poruka u dostupnih u imenskom prostoru MediaWiki.\nPosjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation lokalizaciju MediaWikija] i [https://translatewiki.net translatewiki.net] ako želite doprinijeti općoj lokalizaciji MediaWikija.",
        "allmessagesnotsupportedDB": "Ova stranica ne može biti korištena jer je <i>wgUseDatabaseMessages</i> isključen.",
        "allmessages-filter-legend": "Filter",
        "allmessages-filter": "Filter po stanju podešavanja:",
        "thumbnail-dest-create": "Ne mogu da sačuvam smanjenu sliku (\"thumbnail\") na destinaciju",
        "thumbnail_invalid_params": "Pogrešne postavke smanjenog prikaza",
        "thumbnail_toobigimagearea": "Datoteka sa dimenzijama većim od $1",
-       "thumbnail_dest_directory": "Ne može se napraviti odredišni folder",
+       "thumbnail_dest_directory": "Ne mogu napraviti odredišni folder",
        "thumbnail_image-type": "Tip slike nije podržan",
        "thumbnail_gd-library": "Nekompletna konfiguracija GD biblioteke: nedostaje funkcija $1",
        "thumbnail_image-missing": "Datoteka ne dostaje: $1",
        "import-mapping-subpage": "Uvezi kao podstranice sljedeće stranice:",
        "import-upload-filename": "Naziv datoteke:",
        "import-comment": "Komentar:",
-       "importtext": "Molimo Vas da izvezete datoteku iz izvornog wikija koristeći [[Special:Export|alat za izvoz]].\nSačuvajte je na Vašem računaru i pošaljite ovdje.",
-       "importstart": "Uvoz stranica...",
-       "import-revision-count": "$1 {{PLURAL:$1|revizija|revizije|revizija}}",
+       "importtext": "Izvezite datoteku iz izvornog wikija koristeći [[Special:Export|alat za izvoz]].\nSačuvajte je na svoj računar i postavite je ovdje.",
+       "importstart": "Uvozim stranice...",
+       "import-revision-count": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "importnopages": "Nema stranica za uvoz.",
        "imported-log-entries": "{{PLURAL:$1|Uvezena $1 stavka zapisnika|Uvezene $1 stavke zapisnika|Uvezeno $1 stavki zapisnika}}.",
-       "importfailed": "Uvoz nije uspjeo: $1",
+       "importfailed": "Uvoz nije uspio: $1",
        "importunknownsource": "Nepoznat izvorni tip uvoza",
-       "importcantopen": "Ne može se otvoriti uvozna datoteka",
+       "importcantopen": "Ne mogu otvoriti datoteku za uvoz",
        "importbadinterwiki": "Loš interwiki link",
        "importsuccess": "Uspješno ste uvezli stranicu!",
-       "importnosources": "Nije definisan međuwiki izvor za uvoz i direktna postavljanja historije su isključena.",
+       "importnosources": "Nije definiran međuwiki izvor za uvoz i direktna postavljanja historije su isključena.",
        "importnofile": "Uvozna datoteka nije postavljena.",
        "importuploaderrorsize": "Postavljanje uvozne datoteke nije uspjelo.\nDatoteka je veća nego što je dopušteno.",
        "importuploaderrorpartial": "Postavljanje uvozne datoteke nije uspjelo.\nDatoteka je samo djelimično postavljena.",
        "xml-error-string": "$1 na liniji $2, kolona $3 (bajt $4): $5",
        "import-upload": "Postavljanje XML podataka",
        "import-token-mismatch": "Izgubljeni podaci sesije. Molimo pokušajte ponovno.",
-       "import-invalid-interwiki": "Ne može se uvesti iz navedenog wikija.",
+       "import-invalid-interwiki": "Ne mogu uvesti iz navedenog wikija.",
        "import-error-edit": "Stranica \"$1\" nije uvezena jer vam nije dopušteno da je uređujete.",
        "import-error-create": "Stranica \"$1\" nije uvezena jer vam nije dozvoljeno da je napravite.",
        "import-error-interwiki": "Stranica \"$1\" nije uvezena jer je njen naziv rezerviran za vanjsko povezivanje (interwiki).",
        "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-search": "Pretraži {{GRAMMAR:akuzativ|{{SITENAME}}}}",
        "tooltip-search-go": "Idi na stranicu s tačno ovim imenom ako postoji",
        "tooltip-search-fulltext": "Pretražite stranice s ovim tekstom",
-       "tooltip-p-logo": "Glavna stranica",
+       "tooltip-p-logo": "Posjetite početnu stranicu",
        "tooltip-n-mainpage": "Posjetite početnu stranicu",
        "tooltip-n-mainpage-description": "Posjetite početnu stranicu",
        "tooltip-n-portal": "O projektu, šta možete da uradite, gdje se šta nalazi",
        "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",
        "print.css": "/* CSS umetnut ovdje uticat će na izgled isprintane stranice */",
        "common.js": "/* Bilo koja JavaScript će biti učitana za sve korisnike pri svakom učitavanju stranice. */",
        "anonymous": "{{PLURAL:$1|Anonimni korisnik|$1 anonimna korisnika|$1 anonimnih korisnika}} projekta {{SITENAME}}",
-       "siteuser": "{{SITENAME}} korisnik $1",
+       "siteuser": "{{SITENAME}} {{GENDER:$2|korisnik|korisnica}} $1",
        "anonuser": "{{SITENAME}} anonimni korisnik $1",
        "lastmodifiedatby": "Ovu stranicu posljednji je put {{GENDER:$4|izmijenio|izmijenila}} $3 dana $1 u $2.",
        "othercontribs": "Bazirano na radu od strane korisnika $1.",
        "others": "ostali",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|korisnik|korisnika}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|korisnik|korisnica}}|korisnici}} $1",
        "anonusers": "{{SITENAME}} {{PLURAL:$2|anonimni korisnik|anonimni korisnici}} $1",
        "creditspage": "Autori stranice",
        "nocredits": "Autori ove stranice nisu navedeni.",
        "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.",
+       "markedaspatrollederror": "Ne mogu označiti kao patrolirano",
+       "markedaspatrollederrortext": "Morate izabrati izmjenu koju želite označiti patroliranom.",
        "markedaspatrollederror-noautopatrol": "Nije Vam dopušteno da vlastite izmjene označavate patroliranim.",
-       "markedaspatrollednotify": "Ova izmjena na stranici „$1“ je označena kao pregledana.",
+       "markedaspatrollednotify": "Ova izmjena na stranici $1 označena je kao patrolirana.",
        "markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
        "patrol-log-page": "Zapisnik patroliranja",
        "patrol-log-header": "Ovo je zapisnik patroliranih izmjena.",
-       "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.",
        "previousdiff": "← Starija izmjena",
        "nextdiff": "Novija izmjena →",
        "mediawarning": "'''Upozorenje''': Ova datoteka sadrži loš kod, njegovim izvršavanjem možete da ugrozite Vaš sistem.",
-       "imagemaxsize": "Ograničenje veličine slike:<br />''(za stranice opisa datoteke)''",
+       "imagemaxsize": "Ograničenje veličine slike:<br /><em>(za stranice opisa datoteke)</em>",
        "thumbsize": "Veličina umanjenog prikaza:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|stranica|stranice|stranica}}",
        "file-info": "veličina datoteke: $1, MIME tip: $2",
        "file-no-thumb-animation": "'''Napomena: Zbog tehničkih ograničenja minijature ove datoteke neće biti animirane.'''",
        "file-no-thumb-animation-gif": "'''Napomena: Zbog tehničkih ograničenja, minijature GIF slika visoke rezolucije kao što je ova neće biti animirane.'''",
        "newimages": "Galerija novih slika",
-       "imagelisttext": "Ispod je spisak od '''$1''' {{PLURAL:$1|datoteke|datoteke|datoteka}} poredanih $2.",
+       "imagelisttext": "Ispod je spisak od <strong>$1</strong> {{PLURAL:$1|datoteke|datoteke|datoteka}} poredanih $2.",
        "newimages-summary": "Ova posebna stranica prikazuje nedavno postavljene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ili dio imena):",
        "newimages-showbots": "Pokaži datoteke koje su poslali botovi",
+       "newimages-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",
        "bad_image_list": "Koristi se sljedeći format:\n\nRazmatraju se samo stavke u spisku (linije koje počinju sa *).\nPrvi link u liniji mora biti povezan sa lošom slikom.\nSvi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje se slike pojavljuju ''inline''.",
        "metadata": "Metapodaci",
        "metadata-help": "Ova datoteka sadržava dodatne podatke koje je vjerovatno dodala digitalna kamera ili skener u procesu snimanja, odnosno digitalizacije. Ako je datoteka mijenjana, podaci možda nisu u skladu sa stvarnim stanjem.",
-       "metadata-expand": "Pokaži sve detalje",
-       "metadata-collapse": "Sakrij dodatne podatke",
+       "metadata-expand": "Prikaži detalje",
+       "metadata-collapse": "Sakrij detalje",
        "metadata-fields": "Polja metapodataka slika su prikazani ispod slike će biti uključeni u prikaz stranice slike kada je sakrivena tabela metapodataka. U suprotnom će biti sakrivena po postavkama.\n\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Širina",
        "exif-imagelength": "Visina",
        "exif-spectralsensitivity": "Spektralna osjetljivost",
        "exif-isospeedratings": "Rejting ISO brzine",
        "exif-shutterspeedvalue": "Brzina APEX okidača",
-       "exif-aperturevalue": "APEX otvor",
-       "exif-brightnessvalue": "APEX osvijetljenost",
+       "exif-aperturevalue": "Otvor blende",
+       "exif-brightnessvalue": "Osvijetljenost",
        "exif-exposurebiasvalue": "Kompozicija ekspozicije",
        "exif-maxaperturevalue": "Najveći broj otvora blende",
        "exif-subjectdistance": "Udaljenost objekta",
        "exif-gpslongituderef": "Istočna ili zapadna dužina",
        "exif-gpslongitude": "Dužina",
        "exif-gpsaltituderef": "Referenca visine",
-       "exif-gpsaltitude": "Nadmorska visina",
+       "exif-gpsaltitude": "Visina",
        "exif-gpstimestamp": "GPS vrijeme (atomski sat)",
        "exif-gpssatellites": "Sateliti korišteni pri mjerenju",
        "exif-gpsstatus": "Status prijemnika",
        "monthsall": "sve",
        "confirmemail": "Potvrdite adresu e-pošte",
        "confirmemail_noemail": "Niste unijeli tačnu e-mail adresu u Vaše [[Special:Preferences|korisničke postavke]].",
-       "confirmemail_text": "Ova viki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. Aktivirajte dugme ispod kako bi ste poslali poštu za potvrdu na Vašu adresu. Pošta uključuje link koji sadrži kod; učitajte link u Vaš preglednik da bi ste potvrdili da je adresa Vaše e-pošte validna.",
-       "confirmemail_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_text": "{{SITENAME}} zahtijeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte.\nAktivirajte dugme ispod kako biste poslali poštu za potvrdu na Vašu adresu.\nPošta uključuje link koji sadrži kod;\nučitajte link u Vaš preglednik da biste potvrdili da je adresa Vaše e-pošte validna.",
+       "confirmemail_pending": "Potvrdni kod Vam je već poslan e-poštom;\nako ste nedavno otvorili račun, trebali biste pričekati nekoliko minuta da poslana pošta stigne, prije nego što ponovo zahtijevate novi kod.",
        "confirmemail_send": "Pošaljite kod za potvrdu",
        "confirmemail_sent": "E-pošta za potvrđivanje poslata.",
        "confirmemail_oncreate": "Kod za potvrđivanje Vam je poslat na Vašu e-mail adresu.\nTaj kod nije neophodan za prijavljivanje, ali Vam ne potreban kako bi ste omogućili funkcije wikija zasnovane na e-mailu.",
-       "confirmemail_sendfailed": "{{SITENAME}} Vam ne može poslati poštu za potvrđivanje. Provjerite adresu zbog nepravilnih karaktera.\n\nPovratna pošta: $1",
+       "confirmemail_sendfailed": "{{SITENAME}} Vam ne može poslati potvrdnu e-poruku.\nProvjerite sadrži li adresa nedopuštene znakove.\n\nGreška: $1",
        "confirmemail_invalid": "Netačan kod za potvrdu. Moguće je da je kod istekao.",
        "confirmemail_needlogin": "Morate biti $1 da biste potvrdili adresu vaše e-pošte.",
        "confirmemail_success": "Adresa vaše e-pošte je potvrđena. Možete sad da se prijavite i uživate u viki.",
        "confirmemail_loggedin": "Adresa Vaše e-pošte je potvrđena.",
-       "confirmemail_subject": "{{SITENAME}} – adresa e-pošte za potvrđivanje",
+       "confirmemail_subject": "Potvrda adrese e-pošte na {{GRAMMAR:dativ|{{SITENAME}}}}",
        "confirmemail_body": "Neko, vjerovatno Vi, je sa IP adrese $1 registrovao nalog \"$2\" sa ovom adresom e-pošte na {{SITENAME}}.\n\nDa potvrdite da ovaj nalog stvarno pripada vama i da aktivirate mogućnost e-pošte na {{SITENAME}}, otvorite ovaj link u vašem pregledniku:\n\n$3\n\nAko ovo niste vi, pratite ovaj link da prekinete prijavu:\n$5\n\nOvaj kod za potvrdu će isteći u $4.",
        "confirmemail_body_changed": "Neko, vjerovatno Vi, je sa IP adrese $1\nje promijenio adresu e-pošte računa \"$2\" na ovu adresu za {{SITENAME}}.\n\nDa potvrdite da ovaj nalog stvarno pripada Vama i da reaktivirate mogućnosti e-pošte na {{SITENAME}}, otvorite ovaj link u Vašem pregledniku:\n\n$3\n\nAko ovaj račun *ne* pripada Vama, pratite ovaj link da prekinete odobravanje adrese e-pošte:\n\n$5\n\nOvaj kod za potvrdu će isteći u $4.",
        "confirmemail_body_set": "Neko, vjerovatno Vi, je sa IP adrese $1\npostavio adresu e-pošte računa \"$2\" na ovu adresu za {{SITENAME}}.\n\nDa potvrdite da ovaj račun stvarno pripada Vama i da aktivirate mogućnosti e-pošte na {{SITENAME}}, otvorite ovaj link u Vašem pregledniku:\n\n$3\n\nAko ovaj račun *ne* pripada Vama, pratite ovaj link da prekinete odobravanje adrese e-pošte:\n\n$5\n\nOvaj kôd za potvrdu će isteći u $4.",
        "scarytranscludefailed": "[Neuspješno preusmjerenje šablona na $1]",
        "scarytranscludefailed-httpstatus": "[Preuzimanje šablona nije uspjelo za $1: HTTP $2]",
        "scarytranscludetoolong": "[URL je predugačak]",
-       "deletedwhileediting": "'''Upozorenje''': Ova stranica je obrisana prije nego što ste počeli uređivati!",
-       "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.",
+       "deletedwhileediting": "<strong>Upozorenje:</strong> Ova stranica je obrisana prije nego što ste počeli uređivati!",
+       "confirmrecreate": "{{GENDER:$1|Korisnik|Korisnica}} [[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|obrisao|obrisala}} je ovu stranicu nakon što ste je počeli uređivati iz sljedećeg razloga:\n: <em>$2</em>\n\nPotvrdite da stvarno želite ponovo napraviti ovu stranicu.",
+       "confirmrecreate-noreason": "{{GENDER:$1|Korisnik|Korisnica}} [[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|obrisao|obrisala}} je ovu stranicu nakon što ste je počeli uređivati. Potvrdite da stvarno želite ponovo napraviti ovu stranicu.",
        "recreate": "Ponovno napravi",
        "unit-pixel": "px",
        "confirm_purge_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-deactivate-not-allowed": "Nije moguće deaktivirati oznaku \"$1\".",
        "tags-deactivate-submit": "Deaktiviraj",
        "tags-apply-no-permission": "Nemate dopuštenja da dodate izmjenske oznake zajedno s vašim promjenama.",
-       "tags-apply-not-allowed-one": "Oznaka \"$1\" se ne može ručno dodati.",
+       "tags-apply-not-allowed-one": "Nije dozvoljeno da se oznaka \"$1\" ručno dodaje.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno doda|Sljedeće oznake ne dozvoljavaju da se ručno dodaju}}: $1",
        "tags-update-no-permission": "Nemate dopuštenje da dodate ili uklonite izmjenske oznake sa zasebnih verzija ili zapisničkih unosa.",
-       "tags-update-add-not-allowed-one": "Oznaka \"$1\" se ne može ručno dodati.",
+       "tags-update-add-not-allowed-one": "Nije dozvoljeno da se oznaka \"$1\" ručno dodaje.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno doda|Sljedeće oznake ne dozvoljavaju da se ručno dodaju}}: $1",
        "tags-update-remove-not-allowed-one": "Oznaka \"$1\" se ne može ručno ukloniti.",
        "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno ukloni|Sljedeće oznake ne dozvoljavaju da se ručno uklone}}: $1",
        "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.",
        "revdelete-uname-unhid": "korisničko ime je otkriveno",
        "revdelete-restricted": "primijenjena ograničenja za administratore",
        "revdelete-unrestricted": "uklonjena ograničenja za administratore",
-       "logentry-block-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
+       "logentry-block-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} u trajanju od $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|deblokirao|deblokirala}} je {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke za blokiranje {{GENDER:$4|korisnika|korisnice}} {{GENDER:$4|$3}} u trajanju od $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
        "logentry-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 e42972d..140bbf4 100644 (file)
@@ -55,7 +55,8 @@
                        "KRLS",
                        "Jaumeortola",
                        "Kippelboy",
-                       "Syum90"
+                       "Syum90",
+                       "Xð"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "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",
        "unprotectthispage": "Desprotegeix aquesta pàgina",
        "newpage": "Pàgina nova",
        "talkpage": "Discussió",
-       "talkpagelinktext": "Discussió",
+       "talkpagelinktext": "discussió",
        "specialpage": "Pàgina especial",
        "personaltools": "Eines de l'usuari",
        "articlepage": "Mostra la pàgina",
        "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»",
        "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",
        "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]].",
        "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>.",
        "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",
        "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",
        "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*:",
        "userrights-user-editname": "Introduïu un nom d'usuari:",
        "editusergroup": "Carrega els grups d'usuari",
        "editinguser": "Modificació dels permisos de {{GENDER:$1|l'usuari|la usuària}} <strong>[[User:$1|$1]]</strong>$2",
-       "userrights-editusergroup": "Edita els grups d'usuaris",
-       "userrights-viewusergroup": "Mostra els grups d'usuari",
+       "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-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.",
        "group": "Grup:",
        "group-user": "Usuaris",
        "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",
        "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-highlightbutton-title": "Ressalta els resultats",
+       "rcfilters-highlightmenu-title": "Selecciona un color",
        "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-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",
+       "rcfilters-filter-logactions-description": "Accions administratives, creacions de comptes, eliminacions de pàgines, càrregues...",
        "rcnotefrom": "A sota hi ha {{PLURAL:$5|el canvi|els canvis}} a partir de <strong>$3, $4</strong> (fins a <strong>$1</strong>).",
        "rclistfrom": "Mostra els canvis nous des de $3, $2",
        "rcshowhideminor": "$1 edicions menors",
        "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.",
        "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-reset": "Neteja",
        "apisandbox-retry": "Torna a provar",
        "apisandbox-loading": "S'està carregant la informació del mòdul d'API «$1»...",
+       "apisandbox-no-parameters": "Aquest mòdul API no té paràmetres.",
        "apisandbox-helpurls": "Enllaços d'ajuda",
        "apisandbox-examples": "Exemples",
        "apisandbox-dynamic-parameters": "Paràmetres adicionals",
        "apisandbox-sending-request": "S'està enviant una sol·licitud API...",
        "apisandbox-loading-results": "S'estan reben els resultats de l'API...",
        "apisandbox-results-error": "S'ha produït un error en carregar la resposta de la consulta de l'API: $1.",
-       "apisandbox-request-params-json": "Paràmetres JSON:",
+       "apisandbox-request-selectformat-label": "Mostra les dades de sol·licitud com:",
+       "apisandbox-request-format-url-label": "Cadena de consulta de l'URL",
        "apisandbox-request-url-label": "Sol·licita URL:",
+       "apisandbox-request-json-label": "JSON de sol·licitud:",
        "apisandbox-request-time": "Temps de sol·licitud: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Corregeix el testimoni i torna-ho a enviar",
        "apisandbox-results-fixtoken-fail": "No s'ha pogut recuperar el testimoni «$1».",
        "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}}.",
        "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",
        "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",
        "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-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",
        "svg-long-error": "El fitxer SVG no és vàlid: $1",
        "show-big-image": "Fitxer original",
        "show-big-image-preview": "Mida d'aquesta previsualització: $1.",
+       "show-big-image-preview-differ": "Mida d'aquesta previsualització $3 del fitxer $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Altra resolució|Altres resolucions}}: $1.",
        "show-big-image-size": "$1 × $2 píxels",
        "file-info-gif-looped": "en bucle",
        "tags-delete-not-found": "L'etiqueta «$1» no existeix.",
        "tags-delete-too-many-uses": "L'etiqueta «$1» s'aplica a més {{PLURAL:$2|d'$2 revisió|de $2 revisions}} i, per tant, no pot eliminar-se.",
        "tags-delete-warnings-after-delete": "L'etiqueta \"$1\" ha estat esborrada satisfactòriament, però {{PLURAL:$2|s'ha registrat l'advertència següent|s'han registrat les advertències següents}}:",
+       "tags-delete-no-permission": "No teniu permisos per a eliminar les etiquetes de canvis.",
        "tags-activate-title": "Activa l'etiqueta",
        "tags-activate-question": "Esteu a punt d'activar l'etiqueta «$1».",
        "tags-activate-reason": "Motiu:",
        "tags-deactivate-not-allowed": "No és possible desactivar l'etiqueta «$1».",
        "tags-deactivate-submit": "Desactiva",
        "tags-apply-no-permission": "No teniu permís per canviar etiquetes juntament amb altres canvis.",
+       "tags-apply-blocked": "No podeu aplicar etiquetes de canvis amb els vostres canvis mentre estigueu {{GENDER:$1|blocat|blocada}}.",
        "tags-apply-not-allowed-one": "No es permet aplicar l'etiqueta «$1» manualment.",
        "tags-apply-not-allowed-multi": "No es permet aplicar manualment {{PLURAL:$2|l'etiqueta següent|les etiquetes següents}}: $1",
        "tags-update-no-permission": "No teniu permisos per a afegir o suprimir etiquetes de canvi de revisions individuals o entrades de registre.",
+       "tags-update-blocked": "No podeu afegir o suprimir etiquetes de canvis mentre estigueu {{GENDER:$1|blocat|blocada}}.",
        "tags-update-add-not-allowed-one": "No es permet afegir manualment l'etiqueta «$1».",
        "tags-update-add-not-allowed-multi": "No es permet afegir manualment {{PLURAL:$2|l'etiqueta següent|les etiquetes següents}}: $1",
        "tags-update-remove-not-allowed-one": "No es permet treure l’etiqueta «$1».",
        "htmlform-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.",
        "log-name-tag": "Registre d'etiquetes",
        "rightsnone": "(cap)",
        "revdelete-summary": "el resum d'edició",
+       "rightslogentry-temporary-group": "$1 (temporal, fins a $2)",
        "feedback-adding": "S'està afegint el comentari a la pàgina...",
        "feedback-back": "Enrere",
        "feedback-bugcheck": "Fantàstic! Comproveu que no sigui un dels [$1 problemes ja coneguts].",
        "feedback-useragent": "Agent d'usuari:",
        "searchsuggest-search": "Cerca a {{SITENAME}}",
        "searchsuggest-containing": "que conté ...",
-       "api-error-autoblocked": "S'ha blocat la vostra IP automàticament perquè la va utilitzar un usuari blocat.",
-       "api-error-badaccess-groups": "No teniu permís per a carregar fitxers en aquest wiki.",
        "api-error-badtoken": "Error intern: argument incorrecte.",
-       "api-error-blocked": "Heu estat blocat per poder editar.",
-       "api-error-copyuploaddisabled": "Les càrregues via URL estan desactivades en aquest servidor.",
-       "api-error-duplicate": "Ja hi ha {{PLURAL:$1|un altre fitxer|altres fitxers}} en aquest lloc web amb el mateix contingut.",
-       "api-error-duplicate-archive": "Aquí ja hi ha hagut {{PLURAL:$1|un altre fitxer|altres fitxers}} amb el mateix contingut, i {{PLURAL:$1|va ser esborrat|varen ser esborrats}}.",
-       "api-error-empty-file": "El fitxer que heu tramès està buit.",
        "api-error-emptypage": "No es permet la creació de pàgines noves en blanc.",
-       "api-error-fetchfileerror": "Error intern: quelcom no ha funcionat en accedir al fitxer.",
-       "api-error-fileexists-forbidden": "Ja existeix un fitxer amb el nom «$1» i no pot sobreescriure's.",
-       "api-error-fileexists-shared-forbidden": "Ja existeix un fitxer amb el nom «$1» al repositori de fitxers compartits i no pot sobreescriure's.",
-       "api-error-file-too-large": "El fitxer que heu tramès és massa gran.",
-       "api-error-filename-tooshort": "El nom del fitxer és massa curt.",
-       "api-error-filetype-banned": "Aquest tipus de fitxer està prohibit.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|no és un tipus de fitxer permès|no són tipus de fitxer permesos}}. {{PLURAL:$3|El tipus de fitxer permès és|Els tipus de fitxer permesos són}} $2.",
-       "api-error-filetype-missing": "El nom de fitxer no té extensió.",
-       "api-error-hookaborted": "Un mòdul d'extensió ha cancel·lat la modificació que heu intentat fer.",
-       "api-error-http": "Error intern: no es pot connectar al servidor.",
-       "api-error-illegal-filename": "El nom del fitxer no està permès.",
-       "api-error-internal-error": "Error intern: el procés de càrrega en el wiki no ha funcionat.",
-       "api-error-invalid-file-key": "Error intern: no s'ha trobat el fitxer al dipòsit temporal.",
-       "api-error-missingparam": "Error intern: falten paràmetres a la petició.",
-       "api-error-missingresult": "Error intern: no s'ha pogut determinar si la còpia ha reeixit.",
-       "api-error-mustbeloggedin": "Cal que estigueu autenticats en un compte d'usuari per a poder carregar fitxers.",
-       "api-error-mustbeposted": "Error intern: la sol·licitud necessita HTTP POST.",
-       "api-error-noimageinfo": "La pujada s'ha realitzat amb èxit, però el servidor no ha proporcionat cap informació del fitxer.",
-       "api-error-nomodule": "Error intern: no està definit el mòdul de càrregues.",
-       "api-error-ok-but-empty": "Error intern: no hi ha resposta del servidor.",
-       "api-error-overwrite": "No està permès sobreescriure un fitxer existent.",
-       "api-error-stashfailed": "Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.",
        "api-error-publishfailed": "Error intern: el servidor no ha pogut publicar el fitxer temporal.",
-       "api-error-stasherror": "S'ha produït un error en carregar el fitxer al dipòsit.",
-       "api-error-stashedfilenotfound": "No s'ha trobat el fitxer de l'espai temporal quan es provava de carregar-lo d'allà.",
-       "api-error-stashpathinvalid": "El camí on s'havia de trobar el fitxer de l'espai temporal no és vàlid.",
-       "api-error-stashfilestorage": "S'ha produït un error en emmagatzemar el fitxer en l'espai temporal.",
-       "api-error-stashzerolength": "El servidor no ha pogut desar el fitxer a l'espai temporal perquè tenia longitud zero.",
-       "api-error-stashnotloggedin": "Cal haver iniciat una sessió per desar fitxers en l'espai temporal de càrrega.",
-       "api-error-stashwrongowner": "El fitxer que provàveu d'accedir en l'espai temporal no us pertany.",
-       "api-error-stashnosuchfilekey": "La clau de fitxer que provàveu d'accedir en l'espai temporal no existeix.",
-       "api-error-timeout": "El servidor no ha respost en el temps esperat.",
-       "api-error-unclassified": "S'ha produït un error desconegut",
-       "api-error-unknown-code": "Error desconegut: «$1»",
-       "api-error-unknown-error": "Error intern: quelcom no ha funcionat en intentar carregar el fitxer.",
+       "api-error-stashfailed": "Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.",
        "api-error-unknown-warning": "Avís desconegut: $1",
        "api-error-unknownerror": "Error desconegut: «$1».",
-       "api-error-uploaddisabled": "Estan desactivades les càrregues en aquest wiki",
-       "api-error-verification-error": "Aquest fitxer pot estar danyat, o tenir una extensió incorrecta.",
        "duration-seconds": "$1 {{PLURAL:$1|segon|segons}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minuts}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|hores}}",
        "pagelang-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.",
        "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",
        "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.",
        "authprovider-resetpass-skip-label": "Omet",
        "authprovider-resetpass-skip-help": "Omet el restabliment de contrasenya.",
        "specialpage-securitylevel-not-allowed-title": "No permès",
+       "specialpage-securitylevel-not-allowed": "Ho sentim, no podeu utilitzar la pàgina perquè no es pot verificar la vostra identitat.",
        "authpage-cannot-login": "No s'ha pogut iniciar la sessió.",
        "authpage-cannot-login-continue": "No es pot continuar amb l'inicio de sessió. Probablement la vostra sessió ha expirat.",
        "authpage-cannot-create": "No s'ha pogut iniciar la creació del compte.",
        "authpage-cannot-create-continue": "No es pot prosseguir la creació del compte. Probablement la vostra sessió ha expirat.",
        "authpage-cannot-link": "No s'ha pogut iniciar l'enllaç del compte.",
+       "authpage-cannot-link-continue": "No es pot continuar amb l'enllaç del compte. Possiblement s'ha esgotat el temps de la vostra sessió.",
        "cannotauth-not-allowed-title": "S'ha denegat el permís",
        "cannotauth-not-allowed": "No teniu permisos per utilitzar la pàgina",
        "changecredentials": "Canvi de dades credencials",
        "changecredentials-submit": "Canvia les dades credencials",
+       "changecredentials-invalidsubpage": "$1 no és tipus de credencial vàlid.",
        "changecredentials-success": "Les vostres credencials han estat canviades.",
        "removecredentials": "Suprimeix les credencials",
        "removecredentials-submit": "Suprimeix les credencials",
index eecc893..ec38e90 100644 (file)
        "views": "Хьажарш",
        "toolbox": "ГӀирсаш",
        "tool-link-userrights": "{{GENDER:$1|Декъашхочун}} бакъо хийцар",
+       "tool-link-userrights-readonly": "Хьажа {{GENDER:$1|декъашхочун}} тобанаш",
        "tool-link-emailuser": "Язде {{GENDER:$1|декъашхочунга}} кехат",
        "userpage": "Хьажа декъашхочуьна агӀоне",
        "projectpage": "Хьажа кхолламан агӀоне",
        "createacct-yourpasswordagain-ph": "Кхин цкъа язъе пароль",
        "userlogin-remembermypassword": "Системин чохь Ӏойла",
        "userlogin-signwithsecure": "Ларийна цхьаьнакхетар",
+       "cannotlogin-title": "Чудаха таро яц",
+       "cannotlogin-text": "Чудаха таро яц",
        "cannotloginnow-title": "ХӀинца чудаха таро яц",
+       "cannotloginnow-text": "$1 лелочу хенахь чудаха таро яц.",
+       "cannotcreateaccount-title": "Декъашхочун дӀаяздар кхолла йиш яц",
        "yourdomainname": "Хьан машан меттиг:",
        "password-change-forbidden": "Хьан йиш яц хӀокху вики чохь пароль хийца.",
        "externaldberror": "Арахьара хаамийн базан гӀоьнца аутентификаци ечу хенахь гӀалат даьлла я хьа дӀаяздаран хийцам бан бакъонаш яц.",
        "savearticle": "АгӀо дӀаязъян",
        "savechanges": "Ӏалашбе хийцамаш",
        "publishpage": "АгӀо кхолла",
+       "publishchanges": "АгӀо дӀаязъян",
        "preview": "Хьалххе хьажар",
        "showpreview": "Хьалха хьажар",
        "showdiff": "Бина болу хийцамашка хьажар",
        "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|дехар}} ду.",
        "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": "Керла нисдар гайта динахь:",
        "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",
        "showhideselectedlogentries": "Гайта/къайлаяха хаьржина башхонаш",
        "checkbox-select": "Харжар: $1",
        "checkbox-all": "Массо",
-       "checkbox-none": "ХӀума а",
+       "checkbox-none": "ХӀума",
        "checkbox-invert": "Инверт ян",
        "allpages": "Массо агӀонаш",
        "nextpage": "ТӀаьхьа йогӀу агӀо ($1)",
        "undelete-show-file-submit": "ХӀаъ",
        "namespace": "ЦӀерийн меттигаш:",
        "invert": "Хаьржинарг къайлаяккха",
-       "tooltip-invert": "ХӀоттае хӀара билгало, хаьржинчу цӀерийн анан агӀонийн хийцамаш къайлабаха (кхин дихкина цӀерийн анаш, гайтина елахь)",
+       "tooltip-invert": "ХӀоттае хӀара билгало, хаьржинчу цӀерийн меттигийн агӀонийн хийцамаш къайлабаха (кхин дихкина цӀерийн анаш, гайтина елахь)",
+       "tooltip-whatlinkshere-invert": "ХӀоттае хӀара билгало, хаьржинчу цӀерийн меттигийн агӀонийн хьажоргаш къайлаяха.",
        "namespace_association": "Йихкина меттиг",
        "tooltip-namespace_association": "ХӀоттае хӀара билгало, иштта дийцарийн (я кхин) цӀерийн меттиг юкъахь хилийта",
        "blanknamespace": "(Коьрта)",
        "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": "a,&#32;",
+       "comma-separator": " a,&#32;",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← хьалха йоьду агӀо",
        "imgmultipagenext": "тӀаьхьа йоьгӀу агӀо →",
        "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|сахьт}}",
index 0d9d219..f224ed7 100644 (file)
@@ -18,7 +18,8 @@
                        "Macofe",
                        "Pirehelokan",
                        "Diyariq",
-                       "Sarchia"
+                       "Sarchia",
+                       "Lost Whispers"
                ]
        },
        "tog-underline": "ھێڵ ھێنان بەژێر بەستەرەکان:",
        "tog-editondblclick": "دەستکاریی پەڕە بە دووکرتە",
        "tog-editsectiononrightclick": "دەستکاریی بەشەکان بە کرتەی ڕاست لەسەر سەردێڕی بەشەکان",
        "tog-watchcreations": "ئەو پەڕانەی من دروستم کردوون و ئەو پەڕگانە من بارم کردوون زیاد بکە بە لیستی چاودێڕییەکەم",
-       "tog-watchdefault": "ئەو پەڕانە  و ئەو پەڕگانە من دەستکاریان دەکەم زیاد بکە بە لیستی چاودێڕییەکەم",
+       "tog-watchdefault": "ئەو پەڕانە و ئەو پەڕگانە من دەستکاریان دەکەم زیاد بکە بە لیستی چاودێڕییەکەم",
        "tog-watchmoves": "ئەو پەڕانە و ئەو پەڕگانە کە من گواستومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم",
        "tog-watchdeletion": "ئەو پەڕانە و ئەو پەڕگانە من سڕیومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم",
+       "tog-watchuploads": "ئەو پەڕگە نوێیانەی باریان دەکەم زیاد بکە ناو پێڕستی چاودێرییەکەمەوە",
+       "tog-watchrollback": "ئەو پەڕانەی کە کرداری گەڕاندنەوەم لەسەر ئەنجام داون زیاد بکە ناو پێڕستی چاودێرییەکەمەوە",
        "tog-minordefault": "ھەموو دەستکارییەکان بە ورد نیشان بکە لە حاڵەتی دیفاڵت",
        "tog-previewontop": "پێشبینین بەرلە چوارچێوەی دەستکاری نیشان بدە‌",
        "tog-previewonfirst": "لە یەکەم دەستکاری دا پێشبینین نیشان بدە",
        "newwindow": "(لە پەڕەیەکی نوێدا دەکرێتەوە)",
        "cancel": "ھەڵوەشاندنەوە",
        "moredotdotdot": "زیاتر",
-       "morenotlisted": "ئەم لیستەیە تەواو نییە",
+       "morenotlisted": "ئەم لیستە لەوانەیە تەواو نەبێت",
        "mypage": "پەڕە",
        "mytalk": "لێدوان",
        "anontalk": "لێدوان",
        "searcharticle": "بڕۆ",
        "history": "مێژووی پەڕە",
        "history_short": "مێژووی پەڕە",
+       "history_small": "مێژوو",
        "updatedmarker": "لە دوایین سەردانمدا نوێ کراوەتەوە",
        "printableversion": "وەشانی ئامادەی چاپ",
        "permalink": "بەستەری ھەمیشەیی",
        "view": "بینین",
        "view-foreign": "لە $1دا بیبینە",
        "edit": "دەستکاری",
+       "edit-local": "دەستکاریکردنی زانیارییە ناوخۆییەکان",
        "create": "دروستکردن",
        "create-local": "وەسفی ناوچەیی زۆر بکە",
        "editthispage": "دەستکاری ئەم پەڕەیە بکە‌",
        "talk": "وتووێژ",
        "views": "بینینەکان",
        "toolbox": "ئامرازەکان",
+       "tool-link-userrights": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
+       "tool-link-userrights-readonly": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
+       "tool-link-emailuser": "ئیمەیلی ئەم {{GENDER:$1|بەکارھێنەر}}ە",
        "userpage": "بینینی پەڕەی بەکارھێنەر",
        "projectpage": "پەڕەی پرۆژە نیشان بدە",
        "imagepage": "پەڕەی پەڕگە نیشان بدە",
        "jumptonavigation": "ڕێدۆزی",
        "jumptosearch": "گەڕان",
        "view-pool-error": "ببورە، لەم کاتەدا ڕاژەکارەکان زیادەباریان لە سەرە.\nژمارەیەکی زۆر لە بەکارھێنەران ھاوکات ھەوڵی دیتنی ئەم پەڕەیان داوە.\nتکایە پێش ھەوڵی دووبارە بۆ دیتنی ئەم پەڕە، نەختێک بوەستە.\n\n$1",
+       "generic-pool-error": "ببورە، لەم کاتەدا ڕاژەکارەکان زیادەباریان لە سەرە.\nژمارەیەکی زۆر لە بەکارھێنەران ھاوکات ھەوڵی دیتنی ئەم پەڕەیان داوە.\nتکایە پێش ھەوڵی دووبارە بۆ دیتنی ئەم پەڕە، کەمێک بووەستە.",
        "pool-timeout": "لەکات دەرچوون ڕوویدا لەکاتی چاوەڕوانکردنی داخستندا",
        "pool-errorunknown": "هەڵەی نەزانراو",
        "aboutsite": "دەربارەی {{SITENAME}}",
        "viewsource": "بینینی سەرچاوە",
        "viewsource-title": "سەرچاوەی $1 ببینە",
        "actionthrottled": "چالاکی پێشی پێ گیرا",
-       "actionthrottledtext": "بÛ\95 Ù\85Û\95بÛ\95ستÛ\8c Ù¾Û\8eشگرÛ\8cÛ\8c Ù\84Û\95 Ø³Ù¾Û\95Ù\85Ø\8c Ú\95Û\8eÚ¯Û\95 Ù\86ادرÛ\8eت ØªÛ\86 Ù\84Û\95 Ù\85اÙ\88Û\95Û\8cÛ\95Ú©Û\8c Ú©Ù\88رت Ø¯Ø§ Ù\84Û\95 Ø³Û\95ر Û\8cÛ\95Ú© Ø¦Û\95Ù\85Û\95 Ø²Û\86ر Ø¬Ø§Ø± Ø¦Û\95Ù\86جاÙ\85 Ø¨Ø¯Û\95Û\8cØ\8c Ù\88Û\95 ئیستا تۆ لە ڕادە بەدەرت کردووە.\nتکایە پاش چەند خولەک دووبارە تاقی بکەوە.",
+       "actionthrottledtext": "بÛ\95 Ù\85Û\95بÛ\95ستÛ\8c Ù¾Û\8eشگرÛ\8cÛ\8c Ù\84Û\95 Ø®Ø±Ø§Ù¾Ú©Ø§Ø±Û\8cØ\8c Ú\95Û\8eÚ¯Û\95 Ù\86ادرÛ\8eت ØªÛ\86 Ù\84Û\95 Ù\85اÙ\88Û\95Û\8cÛ\95Ú©Û\8c Ú©Ù\88رت Ø¯Ø§ Ù\84Û\95 Ø³Û\95ر Û\8cÛ\95Ú© Ø¦Û\95Ù\85Û\95 Ø²Û\86ر Ø¬Ø§Ø± Ø¦Û\95Ù\86جاÙ\85 Ø¨Ø¯Û\95Û\8cØ\8c ئیستا تۆ لە ڕادە بەدەرت کردووە.\nتکایە پاش چەند خولەک دووبارە تاقی بکەوە.",
        "protectedpagetext": "بۆ بەرگری لە دەستکاریکردن یان چالاکییەکانی تر ئەم پەڕەیە پارێزراوە.",
        "viewsourcetext": "دەتوانی سەرچاوەی ئەم پەڕە ببینی و کۆپیی بکەی٫",
        "viewyourtext": "دەتوانی ژێدەری <strong>دەستکارییەکەت</strong> لەم پەڕەیەدا ببینی و کۆپی بکەی.",
        "virus-scanfailed": "سکەن ئەنجام نەدرا(کۆد $1)",
        "virus-unknownscanner": "دژەڤایرس نەناسراوە:",
        "logouttext": "'''ئێستا چوویتە دەرەوە.'''\n\nئاگادار بە ھەتا ئەو کاتەی کەشی وێبگەڕەکەت پاک دەکەیتەوە، لەوانەیە ھەندێک لە پەڕەکان وا پێشان بدرێن کە ھێشتا لە ژوورەوە بیت.",
+       "cannotlogoutnow-title": "ناتوانیت لە ئێستادا بچیتە دەرەوە",
+       "cannotlogoutnow-text": "توانای چوونە دەرەوەت نییە لەکاتی بەکارھێنانی $1",
        "welcomeuser": "بەخێربێیت، $1!",
        "welcomecreation-msg": "ھەژمارەکەت دروست کرا.\nلە بیرت نەچێت [[Special:Preferences|ھەڵبژاردەکانی {{SITENAME}}]]ت بگۆڕی.",
        "yourname": "ناوی بەکارھێنەری:",
        "createacct-yourpasswordagain-ph": "تێپەروشە دیسان بنووسەوە",
        "userlogin-remembermypassword": "چوونەژوورەوەکەم ڕابگرە",
        "userlogin-signwithsecure": "پەیوەندیی دڵنیا بەکاربھێنە",
+       "cannotlogin-title": "ناتوانیت بچیتە ژوورەوە",
+       "cannotlogin-text": "توانای چوونەژوورەوەت نییە",
+       "cannotloginnow-title": "ناتوانیت لە ئێستادا بچیتە ناوەوە",
+       "cannotloginnow-text": "توانای چوونەژوورەوەت نییە لەکاتی بەکارھێنانی $1",
+       "cannotcreateaccount-title": "ناتوانرێت ھەژمار دروست بکرێت",
        "yourdomainname": "دۆمەینەکەت:",
        "password-change-forbidden": "ناتوانیت تێپەڕوشەکانت لەم ویکییەدا بگۆڕیت.",
        "externaldberror": "یان هەڵەی ڕێگەپێدانی بنکەدراو هەیە یان ڕێگات پێ نادرێت بۆ نوێ کردنی هەژماری دەرەکیت.",
        "login": "بچۆ ژوورەوە",
+       "login-security": "شوناست دڵنیا بکەرەوە",
        "nav-login-createaccount": "بچۆ ژوورەوە / ھەژمار دروست بکە",
        "userlogin": "بچۆ ژوورەوە / ھەژمار دروست بکە",
        "userloginnocreate": "بچۆ ژوورەوە",
        "userlogin-resetpassword-link": "تێپەڕوشەکەت بیر کردووە؟",
        "userlogin-helplink2": "یارمەتی بۆ چوونەژوورەوە",
        "userlogin-loggedin": "تۆ ھەر ئێستا بە ناوی {{GENDER:$1|$1}} چوویتە ژوورەوە.\nفۆرمی ژێرەوە بەکاربھێنە بۆ چوونەژوورەوە وەک بەکارھێنەرێکی تر.",
+       "userlogin-reauth": "دەبێت دووبارە بچیتە ژوورەوە بۆ دڵنیا بوونەوە لە {{GENDER:$1|$1}}بوونت.",
        "userlogin-createanother": "ھەژمارێکی تر دروست بکە",
        "createacct-emailrequired": "ناونیشانی ئیمەیل",
        "createacct-emailoptional": "ناونیشانی ئیمەیل (دڵخوازانە)",
        "createacct-email-ph": "ناونیشانی ئیمەیلەکەت بنووسە",
        "createacct-another-email-ph": "ناونیشانی ئیمەیڵەکەت بنووسە",
        "createaccountmail": "تێپەڕوشەیەکی ھەڕەمەکیی کاتی بەکاربھێنە و بینێرە بۆ ناونیشانی ئیمەیلی دیاریکراو",
+       "createaccountmail-help": "دەتوانرێت بەکار بھێندرێت بۆ دروستکردنی ھەژمار بۆ کەسێکی تر بەبێ زانینی تێپەڕ وشەکەی.",
        "createacct-realname": "ناوی ڕاستی (دڵخوازانە)",
        "createaccountreason": "هۆکار:",
        "createacct-reason": "ھۆکار",
        "createacct-reason-ph": "بۆ ھەژمارێکی تر دروست دەکەی",
        "createacct-submit": "ھەژمارەکەت دروست بکە",
        "createacct-another-submit": "ھەژمار دروست بکە",
+       "createacct-continue-submit": "بەردەوامبوون لە دروستکردنی ھەژمار",
+       "createacct-another-continue-submit": "بەردەوامبوون لە دروستکردنی ھەژمار",
        "createacct-benefit-heading": "{{SITENAME}} لە لایەن کەسانێک وەکوو خۆت دروست کراوە.",
        "createacct-benefit-body1": "{{PLURAL:$1|دەستکاری}}",
        "createacct-benefit-body2": "{{PLURAL:$1|پەڕە}}",
        "createacct-benefit-body3": "دوایین {{PLURAL:$1|بەشداربوو|بەشداربووان}}",
        "badretype": "تێپەڕوشەکان لەیەک ناچن.",
+       "usernameinprogress": "دروستکردنی ھەژمارێک بۆ ئەم ناوی بەکارھێنەرە لە پڕۆسەی بەرھەمھێناندایە. تکایە چاوەڕوان بە.",
        "userexists": "ئەو ناوەی تۆ داوتە پێشتر بەکارھێنراوە.\nناوێکی دیکە ھەڵبژێرە.",
        "loginerror": "ھەڵەی چوونەژوورەوە",
        "createacct-error": "ھەڵە لە دروستکردنی ھەژمار",
        "nocookiesnew": "ھەژماری بەکارھێنەری دروست کرا، بەڵام نەچوویتەوە ژوورەوە.\n{{SITENAME}} بۆ چوونەوە ژوورەوەی بەکارھێنەر کوکی بەکاردەھێنێت.\nتۆ کوکییەکەکەت لەکارخستووە.\nتکایە کوکییەکە کارا بکە، پاشان بە ناوی بەکارھێنەری و تێپەڕوشەکەت بچۆ ژوورەوە.",
        "nocookieslogin": "{{SITENAME}} بۆ چوونەژوورەوە لە کووکی‌یەکان کەڵک وەرئەگرێت.\nڕێگەت نەداوە بە کووکی‌یەکان.\nڕێگەیان پێ بدەو و دیسان تێبکۆشە.",
        "nocookiesfornew": "ھەژماری بەکارھێنەری دروست نەکرا، چون ناتوانین سەرچاوەکەی پشتڕاست بکەینەوە.\nدڵنیا بە کوکییەکانت چالاک کردووە، پەڕەکە بار بکەوە و دیسان ھەوڵ بدە.",
+       "createacct-loginerror": "ھەژمارەکە بە سەرکەوتوانە دروست کرا، بەڵام ناتوانرێت بە شێوەیەکی ئۆتۆماتیکی بکرێیتە ژوورەوە. تکایە سەردانی [[Special:UserLogin|ڕێنماییەکانی چوونەژوورەوە]] بکە.",
        "noname": "ناوی بەکارهێنەرییەکی گۆنجاوت دیاری نەکردووه.",
        "loginsuccesstitle": "چوویە ناوەوە",
        "loginsuccess": "'''ئێستا بە ناوی «$1»ەوە لە {{SITENAME}} چوویتەتەژوورەوە.'''",
-       "nosuchuser": "بەکارھێنەرێک بە ناوی «$1» نیە.\nناوی بەکارھێنەر بە گەورە و بچووک بوونی پیتەکان ھەستیارە.\nڕێنووسەکەت چاولێکەرەوە، یان [[Special:CreateAccount|ھەژمارێکی نوێ دروست بکە]].",
+       "nosuchuser": "بÛ\95کارھÛ\8eÙ\86Û\95رÛ\8eÚ© Ø¨Û\95 Ù\86اÙ\88Û\8c Â«$1» Ù\86Û\8cÛ\8cÛ\95.\nÙ\86اÙ\88Û\8c Ø¨Û\95کارھÛ\8eÙ\86Û\95ر Ø¨Û\95 Ú¯Û\95Ù\88رÛ\95 Ù\88 Ø¨Ú\86Ù\88Ù\88Ú© Ø¨Ù\88Ù\88Ù\86Û\8c Ù¾Û\8cتÛ\95کاÙ\86 Ú¾Û\95ستÛ\8cارÛ\95.\nÚ\95Û\8eÙ\86Ù\88Ù\88سÛ\95Ú©Û\95ت Ú\86اÙ\88Ù\84Û\8eÚ©Û\95رÛ\95Ù\88Û\95Ø\8c Û\8cاÙ\86 [[Special:CreateAccount|Ú¾Û\95Ú\98Ù\85ارÛ\8eÚ©Û\8c Ù\86Ù\88Û\8e Ø¯Ø±Ù\88ست Ø¨Ú©Û\95]].",
        "nosuchusershort": "بەکارھێنەرێک بە ناوی «$1»ەوە نیە.\nبە نووسراوەکەتدا بچۆرەوە.",
        "nouserspecified": "دەبێت ناوێکی بەکارھێنەری دەستنیشان بکەیت.",
        "login-userblocked": "ئەم بەکارهێنەرە بڵۆک کراوە. چوونەژوورەوە ڕێگەپێنەدراوە.",
        "wrongpassword": "تێپەڕوشەی ھەڵە.\nتکایە دووبارە تێبکۆشە.",
        "wrongpasswordempty": "تێپەڕەوشەی لێدراو بەتاڵبوو.\nتکایە هەوڵ بدەوە.",
        "passwordtooshort": "تێپەڕوشەکەت لانی کەم دەبێ {{PLURAL:$1|١ پیت|$1 پیت}} بێت.",
+       "passwordtoolong": "تێپەڕ وشەکان ناتوانرێت لە {{PLURAL:$1|١ کارەکتەر|$1 کارەکتەر}} درێژتر بێت.",
+       "passwordtoopopular": "تێپەڕ وشە باوەکان ناتواندرێت دابنرێن. تکایە تێپەڕ وشەیەکی دەگمەنتر ھەڵبژێرە.",
        "password-name-match": "تێپەڕوشەکەت ئەبێ جیاواز بێت لە ناوی بەکارهێنەریت.",
        "password-login-forbidden": "بەکارهێنانی ئەم ناوی بەکارهێنەر و تێپەڕەووشەیە قەدەغەکراوە.",
        "mailmypassword": "تێپەڕوشەکە ڕێک بخەوە",
        "noemail": "ھیچ ئەدرەسێکی ئیمەیل تۆمار نەکراوە بۆ بەکارھێنەر « $1 ».",
        "noemailcreate": "دەبێ ناونیشانێکی دروستی ئیمەیل بنووسی",
        "passwordsent": "تێپەڕوشەیەکی نوێ نێررا بۆ ئەدرەسی ئیمێلی تۆمارکراوی «$1».\nتکایە دوای وەرگرتنی، دیسان بچۆ ژوورەوە.",
-       "blocked-mailpassword": "ئادرەسی ئای‌پی تۆ بۆ دەستکاری کردن بەستراوه بۆیە بۆ بەرگری لە بەکارهێنانی نابەجێ ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە.",
+       "blocked-mailpassword": "ناونیشانی ئای پی تۆ بۆ دەستکاری کردن بەستراوه. بۆ بەرگری لە بەکارهێنانی نابەجێ، ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە لەسەر ئەم ناونیشانە ئای پییە.",
        "eauthentsent": "ئیمێلێکی پشتڕاستکردنەوە بۆ ناونیشانی ئیمێلی دیاریکراو نێررا.\nپێش ئەوەی ئیمەیلی تر بۆ ئەم ھەژمارە بنێررێت، دەبێت پەیڕەوی ڕێکارەکانی ناو ئیمێلەکە بکەیت بۆ پشتڕاستکردنەوەی ئەوەی کە ئەم هەژمارە بە ڕاستی ھی تۆیە.",
        "throttled-mailpassword": "ئیمەیلێکی ڕیکخستنەوەی تێپەڕوشە لە ماوەی {{PLURAL:$1|ساعەت}}ی ڕابردوودا نێردراوە.\nبۆ ڕێگری لە بەکارھێنانی خراپ، ھەر {{PLURAL:$1|ساعەت}} تاکە یەک ئیمەیلی ڕیکخستنەوەی تێپەڕوشە دەنێردرێت.",
        "mailerror": "هەڵە ڕوویدا لە ناردنی ئیمەیل: $1",
        "createaccount-title": "درووست کردنی ھەژمار بۆ {{SITENAME}}",
        "createaccount-text": "کەسێک ھەژمارێکی بۆ ناونیشانی ئیمێلی تۆ لە {{SITENAME}}دا ($4) بە ناوی «$2»ـەوە و بە تێپەڕوشەی  «$3»ـەوە دروست کردووە.\nدەبێت ھەر ئێستا بچیتە چوورەوە و تێپەڕوشەیەکەت بگۆڕیت.\n\nئەگەر ئەم ھەژمارە بە ھەڵە دروست کراوە، دەکرێت گوێ بەم پەیامە نەدەیت.",
        "login-throttled": "زۆر زۆر ھەوڵت داوە بۆ چوونە ژوورەوە.\nتکایە $1 بوەستە پێش ھەوڵی دووبارە.",
+       "login-abort-generic": "چوونەژوورەوەکەت شکستی ھێنا - بەجێ ھێڵدرا",
+       "login-migrated-generic": "ھەژمارەکەت گوازراوەتەوە و ناوی بەکارھێنەرەکەت چی تر لەسەر ئەم ویکیپیدیایە بوونی نییە.",
        "loginlanguagelabel": "زمان: $1",
+       "suspicious-userlogout": "داواکارییەکەت بۆ چوونە دەرەوە ڕەت کرایەوە لەبەر ئەوەی وا دیارە داواکارییەکە لەلایەن براوسەرێکی شکاوەوە نێردراوە.",
+       "createacct-another-realname-tip": "ناوی ڕاستیت پێویست نییە.\nئەگەر ھەڵت بژارد کە دایبنێیت، ئەوا بەکار دەھێندرێت بۆ ئاماژە کردن بە بەکارھێنەر بۆ بەشدارییەکانیان.",
        "pt-login": "بچۆ ژوورەوە",
        "pt-login-button": "بچۆ ژوورەوە",
+       "pt-login-continue-button": "بەردەوامبوونی چوونەژوورەوە",
        "pt-createaccount": "ھەژمار دروست بکە",
        "pt-userlogout": "بچۆ دەرەوە",
+       "user-mail-no-addy": "ھەوڵی ناردنی ئیمەڵ درا بەبێ ھەبوونی ناونیشانێکی ئیمەیڵ.",
        "changepassword": "تێپەڕوشە بگۆڕە",
        "resetpass_announce": "بۆ کۆتایی چوونە ژوورەوە، دەبێت تێپەڕوشەیەکی نوێ دابنێیت.",
        "resetpass_text": "<!-- تێپه‌ڕه‌وشه‌ی هه‌ژماره‌كه‌ سفر بكه‌ره‌وه‌ -->",
        "retypenew": "تێپەڕوشەی نوێ دوبارە بنووسەوە:",
        "resetpass_submit": "تێپەڕوشە رێکخە و بچۆ ژوورەوە",
        "changepassword-success": "تێپەڕەوشەکەت  گۆڕدرا!",
+       "changepassword-throttled": "تۆ ھەوڵی زۆری چوونەژوورەوەت داوە. \nتکایە $1 چاوەڕوان بە پێش دووبارە ھەوڵدانەوە.",
+       "botpasswords": "تێپەڕ وشەی بۆت",
+       "botpasswords-disabled": "تێپەڕ وشەی بۆتەکان کوژێنرانەوە.",
+       "botpasswords-label-appid": "ناوی بۆت",
        "botpasswords-label-create": "دروستکردن",
        "botpasswords-label-update": "نوێکردنەوە",
        "botpasswords-label-cancel": "ھەڵوەشاندنەوە",
        "botpasswords-label-delete": "سڕینەوە",
        "botpasswords-label-resetpassword": "ڕێکخستنەوەی تێپەڕوشە",
+       "botpasswords-bad-appid": "ناوی بۆت «$1» دروست نییە.",
+       "botpasswords-created-title": "تێپەڕ وشەی بۆت دروست کرا",
+       "botpasswords-updated-title": "تێپەڕ وشەی بۆتەکە نوێ کرایەوە",
+       "botpasswords-deleted-title": "تێپەڕ وشەی بۆت سڕدرایەوە",
        "resetpass_forbidden": "تێپەڕوشەکە ناگۆڕدرێت",
        "resetpass-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە ئەشێ بچیتە ژوورەوە.",
        "resetpass-submit-loggedin": "تێپەڕوشە بگۆڕە",
        "resetpass-submit-cancel": "ھەڵوەشاندنەوە",
        "resetpass-wrong-oldpass": "تێپەڕوشەی ھەنووکەیی یان تێپەڕوشەی کاتی ھەڵەیە.\nوا دیارە تێپەڕوشەکەت بە سەرکەوتوویی گۆڕدراوە یان داوای تێپەڕوشەیەکی نوێت کردووە.",
+       "resetpass-recycled": "تکایە تێپەڕوشەکەت بگۆڕە بە دانەیەکی جیاواز لەوەی ئێستا.",
+       "resetpass-temp-emailed": "تۆ بە تێپەڕوشەیەکی کاتیی ھاتوویتە ژوورەوە. بۆ تەواوکردنی چوونە ژوورەوە تێپەڕوشەیەکی نوێ لێرە دابنێ.",
        "resetpass-temp-password": "تێپەڕوشەی کاتی:",
+       "resetpass-expired": "تێپەڕ وشەکەت بەسەر چووە، تکایە تێپەڕ وشەیەکی نوێ دابنێ بۆ چوونە ژوورەوە",
+       "resetpass-validity-soft": "تێپەڕ وشەکەت دروست نییە: $1",
        "passwordreset": "ڕێکخستنەوەی تێپەڕوشە",
+       "passwordreset-text-one": "ئەم فۆرمە تەواو بکە بۆ بەدەستھێنانی تێپەڕ وشەیەکی کاتیی بە ئیمەیڵ",
+       "passwordreset-text-many": "{{PLURAL:$1|یەکێک لەم بۆشاییانە بڕ بکەرەوە بۆ بەدەستھێنانی تێپەڕ وشەیەکی کاتیی بە ئیمەیڵ}}",
        "passwordreset-username": "ناوی بەکارھێنەری:",
        "passwordreset-domain": "پاوان:",
        "passwordreset-email": "ناونیشانی ئیمەیل:",
        "passwordreset-emailtext-ip": "‫کەسێک (لەوانەیە خۆت، بە ناونیشانی ئایپیی $1) داوای ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە،\nیان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، دەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "passwordreset-emailtext-user": "‫بەکارھێنەر $1 لە {{SITENAME}} ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە، یان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، \nدەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "passwordreset-emailelement": "ناوی بەکارھێنەری: \n$1\n\nتێپەڕوشەی کاتی: \n$2",
-       "passwordreset-emailsentemail": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا.",
-       "changeemail": "گۆڕینی ناونیشانی ئیمەیل",
-       "changeemail-header": "ناونیشانی ئیمەیلی ھەژمار بگۆڕە",
+       "passwordreset-emailsentemail": "ئەگەر ناونیشانی ئەم ئیمەیڵە بەستراوەتەوە بە ھەژمارەکەتەوە، ئەوا ڕێکخستنەوەی تێپەڕ وشەت بە ئیمەیڵ پێ دەگات.",
+       "passwordreset-emailsentusername": "ئەگەر ناونیشانی ئەم ئیمەیڵە بەستراوەتەوە بە ناوی بەکارھێنەرتەوە، ئەوا ڕێکخستنەوەی تێپەڕ وشەت بە ئیمەیڵ پێ دەگات.",
+       "passwordreset-invalidemail": "ناونیشانی ئیمەیڵی نەگونجاو",
+       "passwordreset-nodata": "نە ئیمەیڵێک یان ناوی بەکارھێنەرێک ھەڵبژێردرا",
+       "changeemail": "گۆڕین یان لابردنی ناونیشانی ئیمەیل",
+       "changeemail-header": "ئەم فۆرمە تەواو بکە بۆ گۆڕینی ناونیشانی ئیمەیڵەکەت. ئەگەر ئارەزووی ئەوە دەکەیت کە ھەر ئیمەیڵێک لە ھەژمارەکەت بکەیتەوە، بۆشایی ئیمەیڵی نوێ بە بەتاڵی بەجێ بھێڵە لەکاتی پاشەکەوتکردنی فۆرمەکە.",
        "changeemail-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە دەبێت بچیتە ژوورەوە.",
        "changeemail-oldemail": "ئەدرەسی ئیمەیڵی ئێستا:",
        "changeemail-newemail": "ناونیشانی ئیمەیلی نوێ:",
+       "changeemail-newemail-help": "ئەم بۆشاییە دەبێت خاڵی بێت ئەگەر دەتەوێت ناونیشانی ئیمەیڵەکەت لابەریت. تۆ ناتوانیت ئیمەیڵی ڕێکخستنەوەی تێپەڕە وشە یاخود ھەر ئیمەیڵێکی تری ئەم ویکییەت پێ بگات ئەگەر ناونیشانی پۆستە ئەلیکترۆنییەکە لاببرێت.",
        "changeemail-none": "(ھیچ)",
        "changeemail-password": "تێپەڕوشەکەت لە {{SITENAME}}:",
        "changeemail-submit": "ئەمەیل بگۆڕە",
+       "changeemail-nochange": "تکایە ناونیشانی ئیمەیڵێکی جیاواز بەکار بھێنە.",
        "bold_sample": "دەقی ئەستوور",
        "bold_tip": "دەقی ئەستوور",
        "italic_sample": "دەقی لار",
        "sig_tip": "واژووەکەت بە مۆری ڕێکەوتەوە",
        "hr_tip": "هێڵی ئاسۆیی (دەگمەن بەکاری بێنە)",
        "summary": "کورتەی دەستکاری:",
-       "subject": "بابەت/سەردێڕ:",
+       "subject": "بابەت:",
        "minoredit": "ئەمە دەستکارییەکی بچووکە",
        "watchthis": "ئەم پەڕەیە بخە ژێر چاودێری",
        "savearticle": "پەڕەکە پاشەکەوت بکە",
        "savechanges": "پاشەکەوتکردنی گۆڕانکارییەکان",
+       "publishpage": "بڵاوکردنەوەی پەڕە",
+       "publishchanges": "پاشەکەوتکردنی گۆڕانکارییەکان",
        "preview": "پێشبینین",
        "showpreview": "پێشبینین نیشان بدە",
        "showdiff": "گۆڕانکارییەکان نیشان بدە",
+       "blankarticle": "<strong>ئاگاداری:</strong> ئەو پەڕەیەی کە ھەوڵی دروستکردنی دەدەیت واڵایە. ئەگەر کرتە لەسەر «{{int:savearticle}}» بکەیت دووبارە، پەڕەکە بەبێ ھیچ ناوەڕۆکێک دروست دەبێت.",
        "anoneditwarning": "<strong>ھۆشیار بە:</strong> نەڕۆیشتووتەتە ژوورەوە. ھەر دەستکارییەک بکەیت ناونیشانی IPیەکەت بۆ ھەموو کەسێک دیار دەبێت. بەڵام ئەگەر <strong>[$1 بچیتە ژوورەوە]</strong> یان <strong>[$2 ھەژمارێک دروست بکەیت]</strong>، دەستکارییەکانت بە ناوی بەکارھێنەرییەکەتەوە بڵاو دەبێتەوە و لە چەند قازانجی تریشی ھەیە.",
        "anonpreviewwarning": "«نەڕۆشتوویتە ژوورەوە. پاشەکەوتکردن، ئەدرەسی IPەکەت لە مێژووی دەستکاریی ئەم پەڕە تۆمار دەکات.»",
        "missingsummary": "'''وە بیر خستنەوە:''' پوختەیەکت نەنووسیوە بۆ چۆنیەتی گۆڕانکارییەکەت.\nئەگەر جارێکی تر پاشکەوت کردن لێبدەی، بێ پوختە تۆمار دەکرێ.",
+       "selfredirect": "<strong>ئاگاداری:</strong> تۆ خەریکی گواستنەوەی ئەم پەڕەیەیت بۆ سەر خۆی. لەوانەیە خەریکی گواستنەوەی پەڕەیەکی ھەڵە بیت یان ھەوڵی گواستنەوە دەدەیت بۆ ئامانجێکی ھەڵە. \nئەگەر دەەبارە کرتە لەسەر «{{int:savearticle}}» بکەیتەوە، ڕەوانەکەرەکە دروست دەکرێت بەھەرحاڵ.",
        "missingcommenttext": "تکایە لە خوارەوە شرۆڤەیەک بنووسە.",
        "missingcommentheader": "'''بیرهێنانەوە:''' بۆ ئەم بۆچوونەت سەردێڕ\\بابەت ڕاچاو نەکردووە.\nئەگەر دیسان «{{int:savearticle}}» لێبدەی، دەستکاریەکەت بێ سەردێڕ یان بابەت پاشەکەوت دەبێ.",
        "summary-preview": "پێشبینینی کورتە:",
-       "subject-preview": "پێشبینینی بابەت/سەردێڕ:",
+       "subject-preview": "پێشبینینی بابەت:",
+       "previewerrortext": "ھەڵەیەک دروست بوو لەکاتی ھەوڵدان بۆ بینینی دەستکارییەکانت.",
        "blockedtitle": "بەکارھێنەر بەربەست کراوە",
        "blockedtext": "'''ناوی بەکارهێنەری یان ئای‌پی ئەدرەسی تۆ بەربەست‌ کراوە.'''\n\nبەربەست لە لایەن $1 کراوە.\nهۆکاری بەربەست کردن ''$2''ە.\n\n* دەستپێکی بەربەست‌کران: $8\n* کۆتایی هاتنی بەربەست‌کران: $6\n* بابەتی بەربەست: $7\n\nبۆ وتووێژ سەبارەت بە بەربەست‌کرانەکە دەبێ پەیوەندی بکەی بە $1 یان یەکێ دی لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوبەران]].\nلە بیرت بێ تاکوو ئیمەیل ئەدرەسێکی بڕوا پێ‌کراو لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]] ڕاچاو نەکەی، نابێت لە هەلی «ئیمەیل ناردن بۆ ئەم بەکارهێنەرە» کەڵک وەر بگری؛ کەڵک وەرگرتن لەوە بەربەست نەکراوە بۆت.\n\nئای‌پی ئەدرەسی ئێستای تۆ $3 و پێناسەی بەربەست‌کراو #$5.\nتکایە لە هەر پرس و داواکاریەکت‌دا هەموو وردەکاریەکانی سەرەوە بگونجێنە.",
        "autoblockedtext": "ناونیشانی IPی تۆ بە شێوەی خۆکارانە بەرگیری لێ کراوە چوونکە بەکارھێنەرێکی دیکە بە خراپی بە کاری ھێناوە و بە دەستی $1 بەرگیری لێ کراوە.\nبەم ھۆکارەوە:\n\n:<em>$2</em>\n\n* دەست پێ کردنی بەرگیری: $8\n* بە سەر چوونی بەرگیری: $6\n* Intended blockee: $7\n\nدەتوانیت پەیوەندی بکەیت بە $1 یان یەکێکی دیکە لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوەبەران]] بۆ وتووێژ لە سەر بەرگیرییەکە.\n\nتێ بگە کە ناتوانیت ئامرازی «ئیمێل بنێرە بۆ ئەم بەکارھێنەرە» بە کار بھێنیت مەگەر ئەوەی کە پێشتر لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]]تدا ناونیشانێکی گونجاوی ئیمێلت تۆمار کردبێت و بەرگیریت لێ نەکرابێت لە بەکارھێنانی ئەو ئامرازەش.\n\nناونیشانی IPی ئێستای تۆ $3ـە و پێناسەی یەرگیرییەکە #$5ـە.\nتکایە ھەموو وردەکارییەکانی سەرەوە ھەبێت لە ھەر پرس و داوایک کە دەیکەیت.",
        "accmailtext": "تێپەڕوشەیەک کە بە هەڕەمەکی بۆ [[User talk:$1|$1]] دروست کرا، نێررا بۆ $2. دەتوانیت لە پەڕەی <em>[[Special:ChangePassword|گۆڕینی تێپەڕوشەدا]]</em> لە کاتی چوونەژوورەوەدا بیگۆڕی.",
        "newarticle": "(نوێ)",
        "newarticletext": "بە دوای بەستەری پەڕەیەک کەوتووی کە ھێشتا دروست نەکراوە.\nبۆ دروست کردنی پەڕەکە، لە چوارچێوەکەی خوارەوە دەست بکە بە تایپ کردن. (بۆ زانیاری زورتر\n[$1 یارمەتی] ببینە).\nئەگەر بە ھەڵەوە ھاتویتە ئێرە، لە سەر دوگمەی '''back'''ی وێبگەڕەکەت کلیک بکە.",
-       "anontalkpagetext": "----''ئەمە لاپەڕەی وتووێژە بۆ بەکارهێنەرێکی نەناسراوە کە هێشتا هەژمارەی درووست‌نەکردووه یان کەڵکی‌ لێ وەرناگرێ .\nلەبەر ئەوە مەجبوورین ئای‌پی ئەدرەسەکی ژمارەیی بۆ ناساندنی بەکار بێنین.\nئای‌پی ئەدرەسی وا لەوانەیه لە لایەن چەندین بەکارهێنەروە بەکاربێت.\nئەگەر تۆ بەکارهێنەرێکی نەناسراوی و هەست ئەکەی ئەم لێدوانە پەیوەندی بە تۆوە نیە تکایە [[Special:CreateAccount|ھەژمارێکی نوێ دروست بکە]] یان [[Special:UserLogin|بچۆ ژوورەوە]] لەبەر ئەوەی لەداهاتوودا دەگەڵ بەکارهێنەرانی‌ نەناسراوی دی تێکەڵ نەکرێیت. ''",
+       "anontalkpagetext": "----\n<em>ئەمە لاپەڕەی وتووێژە بۆ بەکارهێنەرێکی نەناسراوە کە هێشتا هەژمارەی درووست نەکردووه یان کەڵکی‌ لێ وەرناگرێ.</em>\nلەبەر ئەوە ناچارین ناونیشانی ئای پی ژمارەیی بۆ ناساندنی بەکار بێنین.\nناونیشانی ئای پی وا لەوانەیه لە لایەن چەندین بەکارهێنەری ترەوە بەکاربێت.\nئەگەر تۆ بەکارهێنەرێکی نەناسراویت و هەست دەکەیت ئەم لێدوانە پەیوەندی بە تۆوە نییە، تکایە [[Special:CreateAccount|ھەژمارێکی نوێ دروست بکە]] یان [[Special:UserLogin|بچۆ ژوورەوە]] بۆ تێکەڵ نەبوونت لەگەڵ بەکارھێنەرانی نەناسراوی تردا لە داھاتوودا.",
        "noarticletext": "ھەنووکە ھیچ دەقێک لەم پەڕەیەدا نییە.\nدەتوانیت لە پەڕەکانی تردا [[Special:Search/{{PAGENAME}}|بۆ ئەم سەرناوە بگەڕێیت]]،\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لە لۆگە پەیوەندیدارەکاندا بگەڕێیت]،\nیان [{{fullurl:{{FULLPAGENAME}}|action=edit}} ئەم پەڕەیە دروست بکەیت]</span>.",
        "noarticletext-nopermission": "ھەنووکە ھیچ دەقێک لەم پەڕەیەدا نییە.\nدەتوانی لە پەڕەکانی تردا [[Special:Search/{{PAGENAME}}|بۆ ئەم ناوە بگەڕێی]]، یان <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لە لۆگە پەیوەندیدارەکاندا بگەڕێی]</span>، بەڵام ناتوانی ئەم پەڕەیە دروست بکەی.",
+       "missing-revision": "بەسەرداچوونەوەی #$1 پەڕەی «{{FULLPAGENAME}}» بوونی نییە.\n\nئەمە ھەندێک جار ھۆکاری ئەوەیە کە مێژووەکەی بەسەرچووە یاخود پەڕەکە سڕدراوەتە.\nوردەکارییەکان دەتوانرێن ببینرێن لە [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوەدا].",
        "userpage-userdoesnotexist": "ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.\nتکایە دڵنیا ببەرەوە ئەگەر دەتھەوێت ئەم پەڕەیە دروست یان دەستکاری بکەیت.",
        "userpage-userdoesnotexist-view": "ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.",
        "blocked-notice-logextract": "ھەنووکە ئەم بەکارھێنەرە بەربەست کراوە.\nدوایین بابەتی لۆگی بەربەستن لە ژێرەوە ھاتووە:",
-       "clearyourcache": "تێبینی:''' لە دوای پاشەکەوت کردن، لەوانەیە  بۆ بینینی گۆڕانکارییەکان پێویست بێ cacheی وێبگەڕەکەت پاکبکەیتەوە.\n* '''Firefox / Safari:''' دوگمەی ''Shift'' بگرە کاتێک لەسەر ''Reload''دا کرتە دەکەی، یان ھەرکام لە ''Ctrl-F5'' یان ''Ctrl-R'' لێبدە (''⌘-R'' لەسەر Mac دا)\n* '''Google Chrome:''' دوگمەکانی ''Ctrl-Shift-R'' لێبدە  (''⌘-Shift-R'' لەسەر Mac دا)\n* '''Internet Explorer:''' دوگمەی ''Ctrl'' بگرە کاتێک لەسەر  ''Refresh''دا کرتە دەکەی، یان ''Ctrl-F5'' لێبدە\n* '''Opera:''' لە ڕێگەی ''Tools → Preferences'' ەوە cacheەکە بسڕەوە.",
+       "clearyourcache": "<strong>تێبینی:</strong> لە دوای پاشەکەوت کردن، لەوانەیە  بۆ بینینی گۆڕانکارییەکان پێویست بێ کاشی وێبگەڕەکەت پاکبکەیتەوە.\n* '''Firefox / Safari:''' دوگمەی ''Shift'' بگرە کاتێک لەسەر ''Reload''دا کرتە دەکەی، یان ھەرکام لە ''Ctrl-F5'' یان ''Ctrl-R'' لێبدە (''⌘-R'' لەسەر Mac دا)\n* '''Google Chrome:''' دوگمەکانی ''Ctrl-Shift-R'' لێبدە  (''⌘-Shift-R'' لەسەر Mac دا)\n* '''Internet Explorer:''' دوگمەی ''Ctrl'' بگرە کاتێک لەسەر  ''Refresh''دا کرتە دەکەی، یان ''Ctrl-F5'' لێبدە\n* '''Opera:''' لە ڕێگەی ''Tools → Preferences'' ەوە cacheەکە بسڕەوە.",
        "usercssyoucanpreview": "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقی‌کردنەوەی CSS نوێ‌کەت، پێش پاشەکەوت‌کردن.",
        "userjsyoucanpreview": "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقی‌کردنەوەی جاڤاسکریپتە نوێ‌کەت، پێش پاشەکەوت‌کردن.",
        "usercsspreview": "<strong>لە بیرت ببێت کە تەنھا خەریکی پێشبینینی CSSـەکەت دەبینیت.\nھێشتا پاشەکەوەت نەکراوە!</strong>",
        "previewnote": "'''لە بیرت نەچێت ئەمە تەنیا پێشبینینە.'''\nگۆڕانکارییەکانت ھێشتا پاشەکەوت نەکراون!",
        "continue-editing": "چوونە سەر بەشی دەستکاریکردن",
        "previewconflict": "ئەم پێشبینینە بە تۆ نیشان ئەدات ئەو دەقەی لە شوێنی دەستکاری سەرەوە داتناوە چۆن بەرچاو ئەکەوێت ئەگەر پاشەکەوتی بکەیت.",
-       "session_fail_preview": "'''ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی session data.'''\nتکایە دیسان ھەوڵبدەوە.\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونەدەرەوە]] و گەڕانەوەژوورەوە تاقی بکەوە.",
+       "session_fail_preview": "ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی زانیاری و داتاکانی ئەم کۆرسە.\nلەوانەیە ھەژمارەکەت کرابێتە دەرەوە. <strong>تکایە دڵنیا بکەرەوە کە ھێشتا لە ژوورەوەیت و دووبارە ھەوڵ بدەرەوە.</strong>\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونەدەرەوە]] و گەڕانەوەژوورەوە تاقی بکەوە، دواتریش ئەگەر ھێشتا ڕێگەت نەداوە، ڕێگە بە براوسەرەکەت بدە کە ''کوکی'' لەم سایەتەوە وەربگرێت.",
        "session_fail_preview_html": "'''ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی session data.'''\n\n''لەبەر ئەوەی {{SITENAME}} ڕێگەی داوە بە raw HTML، بۆ بەرگری بەرامبەر بە هێرشەکانی جاڤاسکریپت، پێشبینین شاردراوەتەوە.''\n\n'''ئەگەر ئەمە ھەوڵێکی دەستکاریکردنی ڕەوایە، تکایە دیسان ھەوڵبدەوە.'''\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونە دەرەوە]] گەڕانەوەژوورەوە تاقی بکەوە.",
        "token_suffix_mismatch": "'''دەستکاریەکەت پەسەند نەکرا لەبەر ئەوەی ڕاژەخواز یان وێبگەڕەکەت نووسەکانی خاڵبەندی لەیەک پچڕاندوە.'''<br />\nدەستکاریەکەت بۆ بەرگری لە تێکەڵ‌بوونی دەقی لاپەڕەکە وەر نەگیرا.<br />\nئەمە بڕێ‌جار کاتێ ڕوو ئەدات کە لە خزمەتی پرۆکسی سەر وێب کەڵک وەر بگریت.",
+       "edit_form_incomplete": "<strong>ھەندێک بەشی دەستکارییەکانت بە سێرڤەرەکەمان نەگەیشت. دووبارە سەیری دەستکارییەکانت بکە بۆ دڵنیا بوون لە تەواوییان و دووبارە ھەوڵ بدەرەوە.</strong>",
        "editing": "دەستکاریکردنی $1",
        "creating": "دروستکردنی $1",
        "editingsection": "دەستکاریکردنی $1 (بەش)",
        "copyrightwarning": "تکایە ئاگادار بە کە هەموو بەشدارییەکان لە {{SITENAME}} وا فەرز دەکرێت کە لە ژێر  $2دا بڵاودەبنەوە (سەیری $1 بکە بۆ وردەکاریەکان).\nئەگەر ناتەوێ نووسراوەکانت بە بێبەزەیی دەستکاری بکرێن و بە دڵخواز دابەشبکرێنەوە، مەینێرە بۆ ئێرە.<br />\nھەروەھا تۆ بەڵێنمان پێدەدەی کە خۆت ئەمەت نووسیوە یان لە پاوانێکی گشتی (public domain) یان سەرچاوە ئازادەکانی وەک ئەو وەرتگرتووە.\n'''ئەو کارانە کە مافی لەبەرگرتنەوەیان پارێزراوەکان بە بێ وەرگرتنی ئیجازە مەنێرە!'''",
        "copyrightwarning2": "ئاگادار بە کە هەموو بەشدارییەکان لە {{SITENAME}} لەوانەیە بەدەستی بەشداربووانی دیکەوە دەستکاری بکرێن، بگۆڕدرێن یا بسڕێنەوە.\nئەگەر ناتەوێ نووسراوەکانت بێبەزەیی دەستکاری بکرێن، ھەر مەینێرە بۆ ئێرە.<br />\nھەروەھا تۆ بەڵێنمان پێدەدەی کە خۆت ئەمەت نووسیوە یان لە پاوانێکی گشتی (public domain) یان سەرچاوە ئازادەکانی وەک ئەو وەرتگرتووە (سەیری $1 بکە بۆ وردەکاریەکان).\n'''ئەو کارانە کە مافی لەبەرگرتنەوەیان پارێزراوەکان بە بێ وەرگرتنی ئیجازە مەنێرە!'''",
        "longpageerror": "'''ھەڵە: ئەو دەقە تۆ ناردووتە {{PLURAL:$1|یەک کیلۆبایت|$1 کیلۆبایت}} درێژە، کە درێژترە لە زۆرینەی {{PLURAL:$2|یەک کیلۆبایت|$2 کیلۆبایت}}.'''\nئەمە پاشەکەوت ناکرێت.",
-       "readonlywarning": "<strong>ئاگادارÛ\8c: Ø¯Ø§ØªØ§Ø¨Û\95Û\8cس Ø¨Û\86 Ú\86اکسازÛ\8c Ø¯Ø§Ø®Ø±Ø§Ù\88Û\95Ø\8c Ø¨Û\86Û\8cÛ\95 Ø¦Û\8eستا Ù\86اتÙ\88اÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86ت Ù¾Ø§Ø´Û\95Ú©Û\95Ù\88ت Ø¨Ú©Û\95Û\8cت.</strong>\nدÛ\95تÙ\88اÙ\86Û\8cت Ø¯Û\95Ù\82Û\95Ú©Û\95ت Ú©Û\86Ù¾Û\8c Ø¨Ú©Û\95Û\8cت Ø¨Û\86 Ù\81اÛ\8cÙ\84Û\8eک و ھەڵی بگریت بۆ دوایی.\nئەو بەڕێوەبەرەی کە دای خستووە، ئەم هۆکارەی دەستنیشان کردووە: $1",
+       "readonlywarning": "<strong>ئاگادارÛ\8c: Ø¨Ù\86Ú©Û\95Û\8c Ø²Ø§Ù\86Û\8cارÛ\8c Ø¨Û\86 Ú\86اکسازÛ\8c Ø¯Ø§Ø®Ø±Ø§Ù\88Û\95Ø\8c Ø¨Û\86Û\8cÛ\95 Ø¦Û\8eستا Ù\86اتÙ\88اÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86ت Ù¾Ø§Ø´Û\95Ú©Û\95Ù\88ت Ø¨Ú©Û\95Û\8cت.</strong>\nدÛ\95تÙ\88اÙ\86Û\8cت Ø¯Û\95Ù\82Û\95Ú©Û\95ت Ù\84Û\95بÛ\95ر Ø¨Ú¯Ø±Û\8cتÛ\95Ù\88Û\95 Ø¨Û\86 Ù¾Û\95Ú\95Ú¯Û\95Û\8cÛ\95ک و ھەڵی بگریت بۆ دوایی.\nئەو بەڕێوەبەرەی کە دای خستووە، ئەم هۆکارەی دەستنیشان کردووە: $1",
        "protectedpagewarning": "'''وشیار بە: ئەم پەڕە پارێزراوە بۆ ئەوی تەنیا ئەو بەکارھێنەرانە کە مافەکانی بەڕێوەبەرایەتییان ھەیە بتوانن دەستکاریی بکەن.'''\nدوایین لۆگ بۆ ژێدەر لە خوارەوەدا ھاتووە:",
        "semiprotectedpagewarning": "'''ئاگاداری:''' ئەم پەڕە داخراوە بۆ ئەوی تەنھا بەکارھێنەرە تۆمارکراوەکان بتوانن دەستکاریی بکەن.\nدوایین لۆگ بۆ ژێدەر لە خوارەوەدا ھاتووە:",
-       "cascadeprotectedwarning": "'''ئاگاداری:''' ئەم لاپەڕە داخراوە بۆیە تەنها ئەو کەسانەی مافی بەڕێوبەرایەتی‌یان هەیە ئەتوانن دەستکاری بکەن، چۆنکا ئەمە {{PLURAL:$1|لاپه‌ڕه‌|لاپه‌ڕانه‌}} لە زنجیرەی پارێزراوەکانی لە خۆ گرتووە‌:",
+       "cascadeprotectedwarning": "'''ئاگاداری:''' ئەم لاپەڕە داخراوە بۆ ئەوەی تەنھا ئەو کەسانەی کە مافی بەڕێوبەرایەتییان هەیە بتوانن دەستکاری بکەن، چوونکە ئەم {{PLURAL:$1|لاپه‌ڕه‌|لاپه‌ڕانه‌}} لە زنجیرەی پارێزراوەکانی لە خۆ گرتووە‌:",
        "titleprotectedwarning": "'''ئاگاداری: ئەم پەڕە داخراوە، بۆئەوەی بۆ درووست‌کردنی [[Special:ListGroupRights|مافە تایبەتەکانت]] پێویستن.'''\nبۆ چاوانە دوایین لۆگ لە خوارەوەدا ھاتووە:",
        "templatesused": "ئەو {{PLURAL:$1|داڕێژەیە کە لەم پەڕەیەدا بە کارھێنراوە|داڕێژانە کە لەم پەڕەیەدا بە کارھێنراون}}:",
        "templatesusedpreview": "ئەو {{PLURAL:$1|داڕێژەیە کە لەم پێشبینینەدا بە کارھێنراوە|داڕێژانە کە لەم پێشبینینەدا بە کارھێنراون}}:",
        "nocreate-loggedin": "ئیجازەی دروست کردنی پەڕەی نوێت نیە.",
        "sectioneditnotsupported-title": "بەش دەستکاریکردنی پشتیوانی ناکرێ",
        "sectioneditnotsupported-text": "دەستکاریکردنی بەش لە پەڕەدا پشتیوانی ناکرێ.",
-       "permissionserrors": "ھەڵەی ئیجازەکان",
+       "permissionserrors": "ھەڵە لە بە دەست ھێنان",
        "permissionserrorstext": "مافی ئەنجامی ئەوەت نیە لەبەر ئەم {{PLURAL:$1|هۆکار|هۆکارانە}} :",
        "permissionserrorstext-withaction": "دەسەڵاتت نییە بۆ $2، لەبەر ئەم {{PLURAL:$1|ھۆکارە|ھۆکارانە}}ی خوارەوە:",
        "recreate-moveddeleted-warn": "'''ھۆشیار بە: خەریکی پەڕەیەک دروست‌ دەکەیتەوە کە لە پێشدا سڕاوەتەوە.'''\n\nئەمە لەبەر چاو بگرە کە دەستکاریکردنی ئەم پەڕەیە بەقازانجە یان نا.\nلۆگی سڕینەوە و گواستنەوەی ئەم پەڕەیە بۆ سانایی لێرەدا ھاتووە:",
        "moveddeleted-notice": "ئەم پەڕەیە سڕاوەتەوە.\nلۆگی سڕینەوە و گواستنەوە بۆ پەڕەکە لە ژێرەوە دابین کراوە.",
+       "moveddeleted-notice-recent": "ببورە، ئەم پەڕەیە بەم زووانە سڕدراوەتەوە (لە ماوەی ٢٤ کاتژمێری پێشوودا). \nلۆگی سڕینەوە و ڕەوانەکردنی پەڕەکە بەردەستن لە خوارەوە لە پەڕاوێزەکاندا.",
        "log-fulllog": "لۆگی تەواو ببینە",
        "edit-hook-aborted": "دەستکاری لە لایەن قولاپەوە ھەڵوەشێنرایەوە.\nھۆکارەکەی لەبەر دەست نییە.",
        "edit-gone-missing": "توانای نوێ‌کردنەوەی لاپەڕەکە نیە.<br />\nلەوە دەچی سڕدرابێتەوه.‌",
        "edit-conflict": "کێشەی دەستکاری.",
        "edit-no-change": "دەستکاریەکەت بەرچاو نەخرا، لەبەر ئەوەی هیچ گۆڕانکارییەکت لەسەر دەقەکە نەکردووە.",
+       "postedit-confirmation-created": "پەڕەکە دروست کرا.",
+       "postedit-confirmation-restored": "پەڕەکە ھێنرایەوە.",
        "postedit-confirmation-saved": "دەستکارییەکەت پاشەکەوت کرا.",
        "edit-already-exists": "تواناییی دروستکردنی پەڕەی نوێ نییە.\nئەمە پەڕەیە پێشتر هەبووە.",
        "defaultmessagetext": "دەقی پەیامی هەمیشەیی",
        "invalid-content-data": "دراوەی ناوەرۆکی نادروست",
-       "editwarning-warning": "بەجێ‌هێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەست چوونی هەموو ئەو گۆڕانکاریانەی کردووتە.",
+       "content-not-allowed-here": "«$1» ڕێگە پێنەدراوە لەسەر پەڕەی [[$2]]",
+       "editwarning-warning": "بەجێھێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەستدانی هەموو ئەو گۆڕانکاریانەی کە ئەنجامت داون. ئەگەر لە ژوورەوەیت، دەتوانیت ئەم ئاگادارییە لابەریت لە ھەڵبژاردەی بەکارھێنەرت.",
        "content-model-wikitext": "ویکیدەق",
        "content-model-text": "دەقی ساکار",
        "content-model-javascript": "جاڤاسکریپت",
        "content-model-css": "سی ئێس ئێس",
+       "deprecated-self-close-category": "ئەو پەڕانەی کە تاگی ئێچ تی ئێم ئێڵی خۆ-داخراوی ھەڵە بەکاردەھێنن",
+       "duplicate-args-warning": "<strong>ئاگاداری:</strong> ن [[:$1]] بانگی [[:$2]] دەکات بە بەکارھێنانی زیاتر لە یەک بەھا بۆ پارامەتری «$3.» تەنھا کۆتا بەھای کە پێشکەش کراوە بەکار دەھێندرێت.",
        "expensive-parserfunction-warning": "'''ئاگاداری:''' ئەم لاپەڕە ژمارەیەکی زۆر بانگ‌کەری فەنکشێنی لێک‌کەرەوەی لەخۆ گرتوو.<br /><br />\nئەوە دەبێ کەمتر بێت لە $2 {{PLURAL:$2|بانگ‌کەردن|بانگ‌کەردن}} کە ئێستا {{PLURAL:$1|بانگ‌کردنی|بانگ‌کردنی}} تێدایە.",
        "expensive-parserfunction-category": "ئەو لاپەڕانەی  ژمارەیەکی زۆر بانگ‌کەری فەنکشێنی لێک‌کەرەوەیان لەخۆ گرتووە.",
        "post-expand-template-inclusion-warning": "'''ئاگاداری:''' قەبارەی داڕێژەکە زۆر گەورەیە.\nلەوانەیە ھەندێک لە داڕێژەکان لەخۆنەگرێتەوە.",
        "undo-success": "دەکرێ دەستکاریەکە پووچەڵبکرێتەوە.\nتکایە چاو لەو هەڵسەنگاندنەی خوارەوە بکە تا دڵنیا بیت ئەمە ئەوەیە کە‌ دەتویست بیکەی و دواتر گۆڕانکارییەکانی خوارەوە پاشەکەوت بکە بۆ تەواوکردنی پووچەڵکردنەوەکە.",
        "undo-failure": "لەبەر کێشەی دەست‌تێ‌وەردان، ناتوانی دەستکاریەکە ئەنجام‌نەدراو بکەیت.",
        "undo-norev": "ناتوانی دەستکاریەکە ئەنجام‌نەدراو بکەی لەبەر ئەوەی بوونی نیە یا سڕدراوەتەوە.",
+       "undo-nochange": "وا دیارە دەستکارییەکە پووچەڵ کراوەتەوە.",
        "undo-summary": "گەڕاندنەوەی پێداچوونەوەی $1 لە لایەن [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]])",
+       "undo-summary-username-hidden": "پوچەڵکردنەوەی دەستکاری $1 لەلایەن بەکارھێنەرێکی شاردراوەوە.",
        "cantcreateaccount-text": "درووست‌کردنی هەژمارە بۆ ناونیشانی ئای‌پی ('''$1''') لە لایەن [[User:$3|$3]] داخراوە.<br /><br />\n$3 هۆکاری \"$2\" خستوەتەڕوو",
        "viewpagelogs": "لۆگەکانی ئەم پەڕەیە ببینە",
        "nohistory": "هیچ مێژوویەکی دەستکاری نییە بۆ ئەم پەڕەیە.",
        "saveprefs": "پاشەکەوت",
        "restoreprefs": "ھەموو ڕێکخستنەکان ببەرەوە بۆ باری بنچینەیی (لە ھەموو بەشەکاندا)",
        "prefs-editing": "دەستکاریکردن",
-       "rows": "ڕیزەکان:",
-       "columns": "ستوونەکان:",
        "searchresultshead": "گەڕان",
        "stub-threshold": "سنوور بۆ شێوازی <a href=\"#\" class=\"stub\">بەستەری کۆڵکە</a> (بایت):",
        "stub-threshold-disabled": "ناچالاک",
        "editusergroup": "گرووپەکانی بەکارھێنەر دەستکاری بکە",
        "editinguser": "گۆڕینی مافە بەکارھێنەرییەکانی {{GENDER:$1|بەکارھێنەر}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "گرووپە بەکارھێنەرییەکان دەستکاری بکە",
+       "userrights-viewusergroup": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
        "saveusergroups": "گرووپەکانی بەکارھێنەر پاشەکەوت بکە",
        "userrights-groupsmember": "ئەندامە لە:",
        "userrights-groupsmember-auto": "ئەندامی ناڕاشکاوە لە:",
        "right-override-export-depth": "هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێ‌دراو تا قووڵایی 5 لەخۆ بگرێت",
        "right-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
        "right-managechangetags": "دروستکردن و سڕینەوەی [[Special:Tags|تاگەکان]] لە بنکەدراوە",
+       "grant-group-email": "ناردنی ئیمەیل",
+       "grant-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
        "newuserlogpage": "لۆگی دروستکردنی بەکارھێنەر",
        "newuserlogpagetext": "ئەمە لۆگێکی دروستکردنی بەکارھێنەرە.",
        "rightslog": "لۆگی مافەکانی بەکارھێنەر",
        "action-viewmywatchlist": "دیتنی پێرستی چاودێریت",
        "action-viewmyprivateinfo": "زانیارییە تایبەتییەکانت ببینە",
        "action-editmyprivateinfo": "دەستکاری زانیارییە تایبەتییەکانت بکە",
+       "action-purge": "پاکسازی ئەم پەڕەیە بکە",
        "nchanges": "$1 {{PLURAL:$1|گۆڕانکاری}}",
        "enhancedrc-history": "مێژوو",
        "recentchanges": "دوایین گۆڕانکارییەکان",
        "emailpagetext": "دەتوانی لەم فۆرمەی ژێرەوە بۆ ناردنی ئیمەیلێک بۆ ئەم {{GENDER:$1|بەکارھێنەر}}ە کەڵک وەربگریت.\nئەو ناونیشانە ئیمەیلە لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر‌یتدا]] نووسیوتە، لە ناونیشانی «لەلایەن»ی (From) ئیمەیلەکەدا نیشان دەدرێت، کە وایە بەکارھێنەری وەرگر دەتوانێ ڕاستەوخۆ وەڵامت بداتەوە.",
        "defemailsubject": "ئیمەیلی {{SITENAME}} لە بەکارھێنەر «$1»ەوە",
        "usermaildisabled": "ئیمەیڵی بەکارهێنەر لەکاردانیە",
+       "usermaildisabledtext": "ناتوانیت ئیمەیڵ بۆ بەکارھێنەرانی تر بنێریت لەسەر ئەم ویکیپیدیایە",
        "noemailtitle": "هیچ ناونیشانێکی ئی‌مەیل نییە",
        "noemailtext": "ئەم بەکارھێنەرە ناونێشانێکی گونجاوی ئیمێلی دەستنیشان نەکردووە.",
        "nowikiemailtext": "ئەم بەکارهێنەرە تایبەتمەندیی وەرنەگرتنی ئی‌مەیل لە بەکارهێنەرانی دیکەی هەلبژاردووە.",
        "enotif_lastvisited": "بۆ بینینی ھەموو گۆرانکارییەکانی پاش دوایین سەردانت $1 ببینە.",
        "enotif_lastdiff": "بۆ بینینی ئەم گۆڕانکارییە $1 ببینە.",
        "enotif_anon_editor": "بەکارھێنەری نەناسراو $1",
-       "enotif_body": "â\80«$WATCHINGUSERNAMEÛ\8c Ø¨Û\95Ú\95Û\8eزØ\8c\n\n$PAGEINTRO $NEWPAG\n\nÚ©Ù\88رتÛ\95Û\8c Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95Ú©Û\95Û\8c: $PAGESUMMARY $PAGEMINOREDIT\n\nÙ¾Û\95Û\8cÙ\88Û\95Ù\86دÛ\8c Ù\84Û\95Ú¯Û\95Úµ Ø¯Û\95ستکارÛ\8cÚ©Û\95ر:\nÙ\86اÙ\85Û\95: $PAGEEDITOR_EMAIL\nÙ\88Û\8cÚ©Û\8c: $PAGEEDITOR_WIKI\n\nتا Ø³Û\95رداÙ\86Û\8c Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ù\86Û\95Ú©Û\95Û\8cتØ\8c Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86Û\8c Ø¯Ø§Ú¾Ø§ØªÙ\88Ù\88Û\8c Ù¾Û\95Ú\95Û\95Ú©Û\95ت Ù¾Û\8e Ú\95اÙ\86اگÛ\95Û\8cÛ\8eÙ\86درÛ\8eت. Ù\87Û\95رÙ\88Û\95ھا Ø¯Û\95تÙ\88اÙ\86Û\8c Ø¦Ø§ÚµØ§Ú©Ø§Ù\86Û\8c Ú\95اگÛ\95Û\8cاÙ\86دÙ\86 Ù\84Û\95 Ù¾Û\95Ú\95Û\95Û\8c Ú\86اÙ\88دÛ\8eرÛ\8cÛ\8cÛ\95Ú©Û\95تدا Ù\84Û\95 Ø³Û\95رÛ\95تاÙ\88Û\95 Ú\95Û\8eÚ© Ø¨Ø®Û\95Û\8cتÛ\95Ù\88Û\95.\n\nبÛ\95 Ø³Ù¾Ø§Ø³Û\95Ù\88Û\95Ø\8c Ø³Û\8cستÛ\95می ڕاگەیاندنی {{SITENAME}}\n\n--\nبۆ گۆڕینی رێکخستنەکانی ڕاگەیاندن بە ئیمەیل، بڕوانە\n{{canonicalurl:{{#special:Preferences}}}}\n\nبۆ گۆڕینی ڕێکخستنەکانی پێرستی چاودێرییەکەت، بڕوانە\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nبۆ سڕینەوەی پەڕەکە لە پێرستی چاودێرییەکەت، بڕوانە\n$UNWATCHURL\n\nکاردانەوە و یارمەتیی زۆرتر:\n$HELPPAGE",
+       "enotif_body": "â\80«$WATCHINGUSERNAMEÛ\8c Ø¨Û\95Ú\95Û\8eزØ\8c\n\n$PAGEINTRO $NEWPAG\n\nÚ©Ù\88رتÛ\95Û\8c Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95Ú©Û\95Û\8c: $PAGESUMMARY $PAGEMINOREDIT\n\nÙ¾Û\95Û\8cÙ\88Û\95Ù\86دÛ\8c Ù\84Û\95Ú¯Û\95Úµ Ø¯Û\95ستکارÛ\8cÚ©Û\95ر:\nÙ\86اÙ\85Û\95: $PAGEEDITOR_EMAIL\nÙ\88Û\8cÚ©Û\8c: $PAGEEDITOR_WIKI\n\nتا Ø³Û\95رداÙ\86Û\8c Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ù\86Û\95Ú©Û\95Û\8cتØ\8c Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86Û\8c Ø¯Ø§Ú¾Ø§ØªÙ\88Ù\88Û\8c Ù¾Û\95Ú\95Û\95Ú©Û\95ت Ù¾Û\8e Ú\95اÙ\86اگÛ\95Û\8cÛ\8eÙ\86درÛ\8eت. Ù\87Û\95رÙ\88Û\95ھا Ø¯Û\95تÙ\88اÙ\86Û\8c Ø¦Ø§ÚµØ§Ú©Ø§Ù\86Û\8c Ú\95اگÛ\95Û\8cاÙ\86دÙ\86 Ù\84Û\95 Ù¾Û\95Ú\95Û\95Û\8c Ú\86اÙ\88دÛ\8eرÛ\8cÛ\8cÛ\95Ú©Û\95تدا Ù\84Û\95 Ø³Û\95رÛ\95تاÙ\88Û\95 Ú\95Û\8eÚ© Ø¨Ø®Û\95Û\8cتÛ\95Ù\88Û\95.\n\nبÛ\95 Ø³Ù\88پاسÛ\95Ù\88Û\95Ø\8c Ø³Û\8cستمی ڕاگەیاندنی {{SITENAME}}\n\n--\nبۆ گۆڕینی رێکخستنەکانی ڕاگەیاندن بە ئیمەیل، بڕوانە\n{{canonicalurl:{{#special:Preferences}}}}\n\nبۆ گۆڕینی ڕێکخستنەکانی پێرستی چاودێرییەکەت، بڕوانە\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nبۆ سڕینەوەی پەڕەکە لە پێرستی چاودێرییەکەت، بڕوانە\n$UNWATCHURL\n\nکاردانەوە و یارمەتیی زۆرتر:\n$HELPPAGE",
        "created": "دروستکرا",
        "changed": "گۆڕدرا",
        "deletepage": "پەڕە بسڕەوە",
        "alreadyrolled": "دوایین گۆڕانکارییەکان لەسەر [[:$1]] لە لایەن [[User:$2|$2]] ناگەڕێندرێنەوە ([[User talk:$2|لێدوان]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])؛ کەسێکی تر لە پێشدا دەستکاریی کردووە یان گەڕاندوویەتەوە.\n\nدوایین دەستکاری ئەم پەڕە [[User:$3|$3]] کردوویە ([[User talk:$3|لێدوان]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "پوختەی دەستکاری <em>$1</em> بوو.",
        "revertpage": "گەڕاندنەوەی دەستکارییەکانی [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]]) بۆ دوایین پێداچوونەوەی [[User:$1|$1]]",
-       "revertpage-nouser": "دەستکارییەکانی بەکارھێنەرێکی شاڕدراوە بۆ دوایین پێداچوونەوەی {{GENDER:$1|[[User:$1|$1]]}} گەڕێنرایەوە.",
+       "revertpage-nouser": "دەستکارییەکانی بەکارھێنەرێکی شاردراوە بۆ دوایین پێداچوونەوەی {{GENDER:$1|[[User:$1|$1]]}} گەڕێنرایەوە.",
        "rollback-success": "دەستکارییەکانی $1 وەرگێرایەوە؛<br />\nگۆڕدرا بۆ دوایین پێداچوونەوەی $2.",
        "sessionfailure": "لەوەدەچی کێشەیەک لە دانیشتنی چوونەژوورەوەت (login session)دا ببێت.\nئەم کردەوە هەڵوەشێندرایەوە بۆ بەرگری لە دزینی دراوەکانی دانیشتن.\nتکایە بگەڕێوە بۆ پەڕەی پێشوو و نوێی بکەوە، ئینجا دیسان تاقیی بکەوە.",
        "changecontentmodel-title-label": "سەرناوی پەڕە",
        "modifiedarticleprotection": "ئاستی پاراستنی «[[$1]]»ی گۆڕی",
        "unprotectedarticle": "پاراستنی لەسەر «[[$1]]» لابرد",
        "movedarticleprotection": "ڕێککارییەکانی پاراستن لە  «[[$2]]» گوازرایەوە بۆ «[[$1]]»",
+       "unprotectedarticle-comment": "{{GENDER:$2|پاراستنی}} لەسەر ''[[$1]]'' لابرد",
        "protect-title": "گۆڕینی ئاستی پاراستنی \"$1\"",
        "protect-title-notallowed": "دیتنی ئاستی پاراستنی «$1»",
        "prot_1movedto2": "[[$1]] گوازرایەوە بۆ [[$2]]",
        "tooltip-pt-mycontris": "پێڕستی بەشدارییەکان",
        "tooltip-pt-login": "پێشنیارت پێدەکرێ بچیتە ژوورەوە؛ ھەرچەندە زۆرت لێناکرێ",
        "tooltip-pt-logout": "دەرچوون",
+       "tooltip-pt-createaccount": "تۆ ھان دەدرێیت کە ھەژمارێک دروست بکەیت و بچیتە ژوورەوە، ئەمە سەرەکی نییە بەھەرحاڵ",
        "tooltip-ca-talk": "وتووێژ سەبارەت بە پەڕەی ناوەڕۆک",
        "tooltip-ca-edit": "دەستکاری ئەم پەڕەیە بکە‌",
        "tooltip-ca-addsection": "بەشێکی نوێ دەست پێ بکە",
        "exif-imagelength": "بەرزی",
        "exif-orientation": "ئاڕاستە",
        "exif-ycbcrpositioning": "شوێنی Y و C",
+       "exif-xresolution": "شێوازی ئاسۆیی",
+       "exif-yresolution": "شێوازی ستوونی",
        "exif-datetime": "ڕێکەوتی و کاتی گۆڕانی پەڕگە",
        "exif-imagedescription": "ناونیشانی وێنە",
        "exif-make": "بەرھەمھێنەری کامێرا",
        "confirmemail_body_set": "کەسێک، لەوانەیە خۆت، لە ناونیشانی IPی $1 ـەوە،\nلە {{SITENAME}}دا، ناونیشانیی ئیمێلی ھەژماری «$2»ی کردووە بەم ناونیشانە.\n\nبۆ پشتڕاستکردنەوەی ئەوەی کە ئەم ھەژمارە بە ڕاستی ھی تۆیە و بۆ چالاککردنەوەی ئامرازە ئیمێلییەکانی {{SITENAME}}، ئەم لینکە لە وێبگەڕەکەتدا بکەرەوە:\n\n$3\n\nئەگەر ھەژمارەکە ھی تۆ *نییە*، بۆ هەڵوەشاندنەوەی پشتڕاستکردنەوەی ناونیشانی ئیمێل، شوێنی ئەم لینکە بکەوە:\n\n$5\n\nماوەی ئەم کۆدی پشتڕاستکردنەوەیە لە $4دا بە سەر دەچێت.",
        "confirmemail_invalidated": "بڕواپی‌کردنی ناونیشانی ئی‌مەیل هەڵوەشێندراوە",
        "invalidateemail": "هەڵوەشاندنەوەی بڕواپێ‌کردنی ئی‌مەیل",
+       "notificationemail_body_changed": "کەسێک، کە لەوانەیە خۆت بووبێت، لە ناونیشانی IPی $1، ناونیشانی پۆستی ئەلیکترۆنی لە $2ەوە گۆڕی بە $3 لە {{SITENAME}}.\n\nئەگەر ئەمە تۆ نەبوویت، ھەر ئێستا پەیوەندی بە بەڕێوەبەرێکی سایتەکەوە بکە.",
        "scarytranscludetoolong": "[URL زۆر درێژە]",
        "deletedwhileediting": "'''ھۆشیار بە''': ئەم پەڕە دوای ئەوە تۆ دەستکاریکردنیت دەستپێکرد سڕاوەتەوە!",
        "confirmrecreate-noreason": "بەکارھێنەر [[User:$1|$1]] ([[User talk:$1|talk]]) پەڕەکەی سڕییەوە پاش ئەوەی تۆ دەستکاریکردنی پەڕەکەت دەستپێکرد. تکایە پشتڕاستی بکەوە کە بە ڕاستی دەتەوێ دیسان ئەم پەڕە دروست بکەیتەوە.",
        "feedback-submit": "ناردن",
        "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|خولەک|خولەک}}",
        "special-characters-group-thai": "تایلەندی",
        "special-characters-group-khmer": "خمێری",
        "log-action-filter-all": "ھەموو",
-       "log-action-filter-upload-upload": "بارکردنی نوێ"
+       "log-action-filter-upload-upload": "بارکردنی نوێ",
+       "authmanager-email-label": "ئیمەیڵ"
 }
index 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 f0a86b9..9cf8622 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",
        "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",
        "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",
        "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í:",
        "editusergroup": "Načíst uživatelské skupiny",
        "editinguser": "Úprava práv {{GENDER:$1|uživatele|uživatelky}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Prohlížení práv {{GENDER:$1|uživatele|uživatelky}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Upravit uživatelské skupiny",
-       "userrights-viewusergroup": "Zobrazit uživatelské skupiny",
+       "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-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.",
        "group": "Skupina:",
        "group-user": "Uživatelé",
        "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í.",
        "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“.",
        "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. Váš e-mail bude odeslán přímo {{GENDER:$1|původnímu odesílateli, čímž mu|původní odesílatelce, čímž jí}} prozradíte svou e-mailovou adresu.",
+       "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",
        "editcomment": "Shrnutí editace bylo: <em>$1</em>.",
        "revertpage": "Editace uživatele „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]]) vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“",
        "revertpage-nouser": "Editace skrytého uživatele vráceny do předchozího stavu, jehož {{GENDER:$1|autorem|autorkou}} je „[[User:$1|$1]]“",
-       "rollback-success": "Editace uživatele $1 byly vráceny na poslední verzi od uživatele $2.",
+       "rollback-success": "Editace {{GENDER:$3|uživatele|uživatelky}} $1 byly vráceny na poslední verzi od {{GENDER:$4|uživatele|uživatelky}} $2.",
        "rollback-success-notify": "Editace uživatele $1 byly vráceny;\nobnovena poslední verze od uživatele $2. [$3 Zobrazit změny]",
        "sessionfailure-title": "Chyba relace",
        "sessionfailure": "Zřejmě je nějaký problém s vaším přihlášením;\nvámi požadovaná činnost byla stornována jako prevence před neoprávněným přístupem.\nStiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli, a zkuste činnost znovu.",
        "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}}.",
        "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-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",
        "usercssispublic": "Uvědomte si prosím, že podstránky s CSS by neměly obsahovat tajné údaje, protože jsou viditelné ostatním uživatelům.",
        "restrictionsfield-badip": "Neplatná IP adresa nebo rozsah: $1",
        "restrictionsfield-label": "Povolené rozsahy IP adres:",
-       "restrictionsfield-help": "Jedna IP adresa nebo CIDR rozsah na řádek. Všechno povolíte pomocí<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "Jedna IP adresa nebo CIDR rozsah na řádek. Všechno povolíte pomocí:<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 70fbb4b..9d39994 100644 (file)
@@ -7,7 +7,8 @@
                        "Wolliger Mensch",
                        "ОйЛ",
                        "아라",
-                       "Илья Драконов"
+                       "Илья Драконов",
+                       "Vvs-dm"
                ]
        },
        "tog-oldsig": "нꙑнѣшьн҄ь аѵтографъ :",
        "prefs-resetpass": "таина словєсє иꙁмѣнѥниѥ",
        "saveprefs": "съхранѥниѥ",
        "prefs-editing": "исправлѥниѥ",
-       "rows": "рѧдꙑ :",
        "searchresultshead": "исканиѥ",
        "savedprefs": "твои строи иꙁмѣнєнъ ѥстъ",
        "localtime": "мѣстьно врѣмѧ :",
        "sourcefilename": "источьна дѣла имꙗ :",
        "watchthisupload": "си дѣла блюдєниѥ",
        "upload-dialog-button-cancel": "отъмѣтаниѥ",
+       "upload-form-label-infoform-categories": "Катигории",
        "license": "прощєниѥ :",
        "license-header": "прощєниѥ",
        "imgfile": "дѣло",
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 96f4e0c..e3291ce 100644 (file)
        "tog-newpageshidepatrolled": "Skjul patruljerede sider på listen over nye sider",
        "tog-hidecategorization": "Skjul kategorisering af sider",
        "tog-extendwatchlist": "Udvid overvågningslisten til at vise alle ændringer og ikke kun den nyeste",
-       "tog-usenewrc": "Gruppér ændringer per side i listen over seneste ændringer og i overvågningslisten",
+       "tog-usenewrc": "Gruppér ændringer efter side i listen over seneste ændringer og i overvågningslisten",
        "tog-numberheadings": "Automatisk nummerering af overskrifter",
        "tog-showtoolbar": "Vis værktøjslinje til redigering",
        "tog-editondblclick": "Redigér sider med dobbeltklik",
        "tog-editsectiononrightclick": "Redigér afsnit ved at højreklikke på deres titler",
-       "tog-watchcreations": "Tilføj sider, jeg opretter, og filer, jeg lægger op, til min overvågningsliste",
-       "tog-watchdefault": "Tilføj sider og filer, jeg redigerer, til min overvågningsliste",
-       "tog-watchmoves": "Tilføj sider og filer, jeg flytter, til min overvågningsliste",
-       "tog-watchdeletion": "Tilføj sider og filer, jeg sletter, til min overvågningsliste",
-       "tog-watchuploads": "Tilføj nye filer jeg uploader til min overvågningsliste",
-       "tog-watchrollback": "Tilføj sider, hvor jeg har udført en tilbagerulning til min overvågningsliste",
+       "tog-watchcreations": "Føj sider, jeg opretter, og filer, jeg lægger op, til min overvågningsliste",
+       "tog-watchdefault": "Føj sider og filer, jeg redigerer, til min overvågningsliste",
+       "tog-watchmoves": "Føj sider og filer, jeg flytter, til min overvågningsliste",
+       "tog-watchdeletion": "Føj sider og filer, jeg sletter, til min overvågningsliste",
+       "tog-watchuploads": "Føj nye filer, jeg uploader, til min overvågningsliste",
+       "tog-watchrollback": "Føj sider, hvor jeg har udført en tilbagerulning, til min overvågningsliste",
        "tog-minordefault": "Markér som standard alle redigeringer som mindre",
        "tog-previewontop": "Vis forhåndsvisning over redigeringsboksen",
        "tog-previewonfirst": "Vis forhåndsvisning ved første redigering",
        "tog-ccmeonemails": "Send mig kopier af e-mails som jeg sender til andre brugere",
        "tog-diffonly": "Vis ikke sideindhold neden under versionssammenligninger",
        "tog-showhiddencats": "Vis skjulte kategorier",
-       "tog-norollbackdiff": "Vis ikke forskel efter tilbagerulning",
+       "tog-norollbackdiff": "Vis ikke forskel efter udførelse af en tilbagerulning",
        "tog-useeditwarning": "Advar mig, hvis jeg forlader en redigeringsside med ændringer, der ikke er gemt.",
-       "tog-prefershttps": "Brug altid en sikker forbindelse, når du er logget ind",
+       "tog-prefershttps": "Brug altid en sikker forbindelse, når jeg er logget ind",
        "underline-always": "Altid",
        "underline-never": "Aldrig",
        "underline-default": "Brug browserens indstilling eller standarden for det valgte udseende",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategorier}}",
        "category_header": "Sider i kategorien \"$1\"",
        "subcategories": "Underkategorier",
-       "category-media-header": "Medier i kategorien „$1“",
-       "category-empty": "''Denne kategori indeholder for øjeblikket hverken sider eller medie-filer.''",
+       "category-media-header": "Medier i kategorien \"$1\"",
+       "category-empty": "<em>Denne kategori indeholder for øjeblikket hverken sider eller medie-filer.</em>",
        "hidden-categories": "{{PLURAL:$1|Skjult kategori|Skjulte kategorier}}",
        "hidden-category-category": "Skjulte kategorier",
-       "category-subcat-count": "{{PLURAL:$2|Denne kategori har en underkategori.|Denne kategori indeholder nedenstående {{PLURAL:$1|underkategori|$1 underkategorier}}, af i alt $2.}}",
-       "category-subcat-count-limited": "Denne kategori indeholder {{PLURAL:$1|underkategori|$1 underkategorier}}.",
-       "category-article-count": "Denne kategori indeholder {{PLURAL:$2|kun den nedenstående side|{{PLURAL:$1|den nedenstående side|de nedenstående $1 sider}} af i alt $2.}}",
-       "category-article-count-limited": "Kategorien indeholder {{PLURAL:$1|den nedenstående side|de nedenstående $1 sider}}.",
-       "category-file-count": "Denne kategori indeholder {{PLURAL:$2|kun den nedenstående fil.|{{PLURAL:$1|den nedenstående fil|de nedenstående $1 filer}} af i alt $2.}}",
-       "category-file-count-limited": "Kategorien indeholder {{PLURAL:$1|den nedenstående fil|de nedenstående $1 filer}}.",
+       "category-subcat-count": "{{PLURAL:$2|Denne kategori har kun den nedenstående underkategori.|Denne kategori har nedenstående {{PLURAL:$1|underkategori|$1 underkategorier}}, af i alt $2.}}",
+       "category-subcat-count-limited": "Denne kategori har nedenstående {{PLURAL:$1|underkategori|$1 underkategorier}}.",
+       "category-article-count": "{{PLURAL:$2|Denne kategori indeholder kun den nedenstående side.|{{PLURAL:$1|Den nedenstående side|De nedenstående $1 sider}} er i denne kategori, ud af i alt $2.}}",
+       "category-article-count-limited": "{{PLURAL:$1|Den nedenstående side|De nedenstående $1 sider}} er i denne kategori.",
+       "category-file-count": "{{PLURAL:$2|Denne kategori indeholder kun den nedenstående fil.|{{PLURAL:$1|Den nedenstående fil|De nedenstående $1 filer}} er i denne kategori, ud af i alt $2.}}",
+       "category-file-count-limited": "{{PLURAL:$1|Den nedenstående fil|De nedenstående $1 filer}} er i denne kategori.",
        "listingcontinuesabbrev": "forts.",
        "index-category": "Indekserede sider",
        "noindex-category": "Ikke-indekserede sider",
        "qbfind": "Søg",
        "qbbrowse": "Gennemse",
        "qbedit": "Redigér",
-       "qbpageoptions": "Indstillinger for side",
-       "qbmyoptions": "Mine indstillinger",
+       "qbpageoptions": "Denne side",
+       "qbmyoptions": "Mine sider",
        "faq": "OSS",
        "faqpage": "Project:OSS",
        "actions": "Handlinger",
        "tagline": "Fra {{SITENAME}}",
        "help": "Hjælp",
        "search": "Søg",
-       "search-ignored-headings": " #<!-- lad denne linje være præcis som den er --> <pre>\n# Overskrifter, der vil blive ignoreret af søgning.\n# Ændringer til dette træder i kraft så snart siden med overskriften er indekseret.\n# Du kan tvinge siden til genindeksering ved at lave en nul redigering.\n# syntaksen er som følger:\n#   * Alt fra en tegnet \"#\" til slutningen af linjen er en kommentar\n#   * Hver ikke-tomme linje er den nøjagtige titel der skal ignoreres, der skelnes også mellem store og små bogstaver\nReferencer\nEksterne henvisninger\nSe også\nKilder og henvisninger\nEksterne kilder/henvisninger\nKilder\n #</pre> <!-- lad denne linje være præcis som den er -->",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Overskrifter, der vil blive ignoreret af søgning.\n# Ændringer til dette træder i kraft så snart siden med overskriften er indekseret.\n# Du gennemtvinge genindeksering af siden ved at lave en tom redigering.\n# Syntaksen er som følger:\n#   * Alt fra et \"#\"-tegn til slutningen af linjen er en kommentar.\n#   * Hver ikke-tom linje er den nøjagtige titel der skal ignoreres; der skelnes mellem store og små bogstaver.\nReferencer\nEksterne henvisninger\nSe også\nKilder og henvisninger\nEksterne kilder/henvisninger\nKilder\n #<!-- leave this line exactly as it is --> <pre>",
        "searchbutton": "Søg",
        "go": "Gå til",
        "searcharticle": "Gå til",
        "history": "Historik",
        "history_short": "Historik",
+       "history_small": "historik",
        "updatedmarker": "opdateret siden seneste besøg",
        "printableversion": "Udskriftsvenlig udgave",
        "permalink": "Permanent henvisning",
        "delete": "Slet",
        "deletethispage": "Slet side",
        "undeletethispage": "Gendan denne side",
-       "undelete_short": "Fortryd sletning af {{PLURAL:$1|én version|$1 versioner}}",
-       "viewdeleted_short": "Vis {{PLURAL:$1|en slettet redigering|$1 slettede redigeringer}}",
+       "undelete_short": "Gendan {{PLURAL:$1|én redigering|$1 redigeringer}}",
+       "viewdeleted_short": "Vis {{PLURAL:$1|én slettet redigering|$1 slettede redigeringer}}",
        "protect": "Beskyt",
        "protect_change": "ændr",
        "protectthispage": "Beskyt side",
        "unprotect": "Ændr beskyttelse",
-       "unprotectthispage": "Ændre beskyttelsen af denne side",
+       "unprotectthispage": "Ændr beskyttelsen af denne side",
        "newpage": "Ny side",
        "talkpage": "Diskussion",
        "talkpagelinktext": "diskussion",
        "tool-link-userrights": "Ændre {{GENDER:$1|bruger}}grupper",
        "tool-link-userrights-readonly": "Se {{GENDER:$1|bruger}}grupper",
        "tool-link-emailuser": "Send e-mail til denne {{GENDER:$1|bruger}}",
-       "userpage": "Se brugersiden",
-       "projectpage": "Se projektsiden",
-       "imagepage": "Se filside",
-       "mediawikipage": "Vise indholdsside",
-       "templatepage": "Vise skabelonside",
-       "viewhelppage": "Vise hjælpeside",
-       "categorypage": "Vise kategoriside",
-       "viewtalkpage": "Se diskussion",
-       "otherlanguages": "Andre sprog",
+       "userpage": "Vis brugerside",
+       "projectpage": "Vis projektside",
+       "imagepage": "Vis filside",
+       "mediawikipage": "Vis indholdsside",
+       "templatepage": "Vis skabelonside",
+       "viewhelppage": "Vis hjælpeside",
+       "categorypage": "Vis kategoriside",
+       "viewtalkpage": "Vis diskussion",
+       "otherlanguages": "På andre sprog",
        "redirectedfrom": "(Omdirigeret fra $1)",
        "redirectpagesub": "Omdirigeringsside",
        "redirectto": "Omdiriger til:",
        "lastmodifiedat": "Denne side blev senest ændret $1 kl. $2.",
-       "viewcount": "Siden er vist {{PLURAL:$1|en gang|$1 gange}}.",
+       "viewcount": "Siden er vist {{PLURAL:$1|én gang|$1 gange}}.",
        "protectedpage": "Beskyttet side",
        "jumpto": "Skift til:",
        "jumptonavigation": "navigering",
        "jumptosearch": "søgning",
-       "view-pool-error": "Beklager, men serverne er i øjeblikket overbelastede.\nFor mange brugere prøver at se denne side.\nVent et øjeblik, før du prøver at besøge denne side igen.\n\n$1",
-       "generic-pool-error": "Beklager, men serverne er i øjeblikket overbelastede.\nFor mange brugere prøver at se denne side.\nVent et øjeblik før du prøver at besøge denne side igen.",
-       "pool-timeout": "Timeout mens man venter på låsningen",
-       "pool-queuefull": "Pool køen er fuld",
+       "view-pool-error": "Beklager, men serverne er i øjeblikket overbelastede.\nFor mange brugere prøver at se denne side.\nVent venligst lidt, før du igen prøver at besøge denne side.\n\n$1",
+       "generic-pool-error": "Beklager, men serverne er i øjeblikket overbelastede.\nFor mange brugere prøver at se denne side.\nVent venligst lidt, før du igen prøver at besøge denne side.",
+       "pool-timeout": "Timeout mens der blev ventet på låsen",
+       "pool-queuefull": "Puljekøen er fuld",
        "pool-errorunknown": "Ukendt fejl",
-       "pool-servererror": "Pool-counter servicen er ikke til rådighed ($1).",
+       "pool-servererror": "Puljetæller-tjenesten er ikke til rådighed ($1).",
        "poolcounter-usage-error": "Brugsfejl: $1",
        "aboutsite": "Om {{SITENAME}}",
        "aboutpage": "Project:Om",
        "privacy": "Behandling af personlige oplysninger",
        "privacypage": "Project:Behandling af personlige oplysninger",
        "badaccess": "Manglende rettigheder",
-       "badaccess-group0": "Du har ikke de nødvendige rettigheder til denne handling.",
-       "badaccess-groups": "Denne handling kan kun udføres af brugere som tilhører {{PLURAL:$2|gruppen|en af grupperne:}} $1.",
+       "badaccess-group0": "Du har ikke de nødvendige rettigheder til at udføre den handling, du har anmodet om.",
+       "badaccess-groups": "Denne handling kan kun udføres af brugere i {{PLURAL:$2|gruppen|disse grupper:}} $1.",
        "versionrequired": "Kræver version $1 af MediaWiki",
-       "versionrequiredtext": "Version $1 af MediaWiki er påkrævet, for at bruge denne side. Se [[Special:Version|Versionssiden]]",
+       "versionrequiredtext": "Version $1 af MediaWiki er nødvendig for at bruge denne side. Se [[Special:Version|Versionssiden]]",
        "ok": "OK",
        "retrievedfrom": "Hentet fra \"$1\"",
        "youhavenewmessages": "Du har $1 ($2).",
-       "youhavenewmessagesfromusers": "Du har $1 fra {{PLURAL:$3|en anden bruger| $3 brugere}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Du har}} $1 fra {{PLURAL:$3|en anden bruger|$3 brugere}} ($2).",
        "youhavenewmessagesmanyusers": "Du har $1 fra mange brugere ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|en ny besked|999=nye beskeder}}",
        "newmessagesdifflinkplural": "seneste {{PLURAL:$1|ændring|999=ændringer}}",
        "confirmable-confirm": "Er {{GENDER:$1|du}} sikker?",
        "confirmable-yes": "Ja",
        "confirmable-no": "Nej",
-       "thisisdeleted": "Se eller gendan $1?",
+       "thisisdeleted": "Vis eller gendan $1?",
        "viewdeleted": "Vis $1?",
-       "restorelink": "{{PLURAL:$1|en slettet ændring|$1 slettede ændringer}}",
+       "restorelink": "{{PLURAL:$1|én slettet redigering|$1 slettede redigeringer}}",
        "feedlinks": "Feed:",
        "feed-invalid": "Ugyldig abonnementstype.",
        "feed-unavailable": "Der er ingen syndikeringsfeeds tilgængelige",
        "site-atom-feed": "$1 Atom-feed",
        "page-rss-feed": "\"$1\" RSS-feed",
        "page-atom-feed": "\"$1\" Atom-feed",
-       "red-link-title": "$1 (siden er ikke skrevet endnu)",
+       "red-link-title": "$1 (siden findes ikke)",
        "sort-descending": "Sorter faldende",
        "sort-ascending": "Sorter stigende",
        "nstab-main": "Side",
        "nstab-category": "Kategori",
        "mainpage-nstab": "Forside",
        "nosuchaction": "Funktionen findes ikke",
-       "nosuchactiontext": "Handlingen som er angivet i URL'en er ugyldig.\nDu kan have skrevet URL'en forkert, eller fulgt en ukorrekt henvisning.\nDet kan også skyldes en fejl i programmellet som bruges af {{SITENAME}}.",
+       "nosuchactiontext": "Handlingen som er angivet i URL'en er ugyldig.\nDu har måske skrevet URL'en forkert eller fulgt en ukorrekt henvisning.\nDet kan også skyldes en fejl i programmellet som bruges af {{SITENAME}}.",
        "nosuchspecialpage": "En sådan specialside findes ikke",
-       "nospecialpagetext": "<strong>Du har bedt om en specialside, der ikke kan genkendes af MediaWiki-softwaren.</strong>\nEn liste over gyldige specialsider findes på [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>Du har bedt om en specialside, som ikke findes.</strong>\n\nEn liste over gyldige specialsider kan findes på [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Fejl",
        "databaseerror": "Databasefejl",
-       "databaseerror-text": "Der opstod fejl i en forespørgsel til databasen.\nDette kan indikere en fejl i softwaren.",
-       "databaseerror-textcl": "Der opstod fejl i en forespørgsel til databasen.",
+       "databaseerror-text": "Der opstod en fejl i en forespørgsel til databasen.\nDette kan skyldes en programmeringsfejl i softwaren.",
+       "databaseerror-textcl": "Der opstod en fejl i en forespørgsel til databasen.",
        "databaseerror-query": "Forespørgsel: $1",
        "databaseerror-function": "Funktion: $1",
        "databaseerror-error": "Fejl: $1",
-       "transaction-duration-limit-exceeded": "For at undgå høje replikationsforsinkelser blev denne transaktion afbrudt fordi tiden det tog at lagre ($1) oversteg maksimumsgrænsen på $2 {{PLURAL:$2|sekund|sekunder}}.\nHvis du er ved at ændre mange emner på en gang, så prøv at udføre flere mindre operationer i stedet.",
-       "laggedslavemode": "'''Bemærk:''' Den viste side indeholder muligvis ikke de nyeste ændringer.",
-       "readonly": "Databasen er skrivebeskyttet",
-       "enterlockreason": "Skriv en begrundelse for skrivebeskyttelsen, med samt en vurdering af, hvornår skrivebeskyttelsen ophæves igen",
-       "readonlytext": "Databasen er i øjeblikket låst for nye poster og andre ændringer, formentlig pga. rutinemæssig databasevedligeholdelse, hvorefter den vil være tilbage til normalen.\n\nSystemadministratoren som låste den, gav denne forklaring: $1",
-       "missing-article": "Databasen burde indeholde siden \"$1\" $2, men det gør den ikke.\n\nDen sandsynlige årsag er at du har fulgt et forældet link til en forskel eller en gammel version af en side der er blevet slettet.\n\nHvis det ikke er tilfældet, har du muligvis fundet en software-fejl.\nGør venligst en [[Special:ListUsers/sysop|administrator]] opmærksom på det, og husk at fortælle hvilken URL du har fulgt.",
+       "transaction-duration-limit-exceeded": "For at undgå høj replikationsforsinkelse blev denne transaktion afbrudt, fordi tiden det tog at lagre ($1) oversteg grænsen på $2 {{PLURAL:$2|sekund|sekunder}}.\nHvis du er ved at ændre mange emner på en gang, så prøv at udføre flere mindre operationer i stedet.",
+       "laggedslavemode": "<strong>Advarsel:</strong> Siden indeholder muligvis ikke de nyeste ændringer.",
+       "readonly": "Databasen er låst",
+       "enterlockreason": "Skriv en begrundelse for låsningen, inklusive en vurdering af hvornår den vil blive ophævet igen",
+       "readonlytext": "Databasen er i øjeblikket låst for nye poster og andre ændringer, formentlig pga. rutinemæssig databasevedligeholdelse, hvorefter den vil være tilbage til normalen.\n\nDen systemadministrator, som låste den, gav denne forklaring: $1",
+       "missing-article": "Databasen burde indeholde siden \"$1\" $2, men det gør den ikke.\n\nDette skyldes normalt at du har fulgt et forældet link til en forskel eller til en gammel version af en side der er blevet slettet.\n\nHvis det ikke er tilfældet, har du muligvis fundet en programmeringsfejl i softwaren.\nGør venligst en [[Special:ListUsers/sysop|administrator]] opmærksom på det, og sørg for at fortælle vedkommende hvilken URL, du har fulgt.",
        "missingarticle-rev": "(versionsnummer: $1)",
-       "missingarticle-diff": "(Forskel: $1, $2)",
-       "readonly_lag": "Databasen er automatisk blevet låst mens slave database serverne synkronisere med master databasen",
-       "nonwrite-api-promise-error": "HTTP-headeren 'Promise-Non-Write-API-Action' blev sendt, men forespørgslen var til et API skrivemodul.",
+       "missingarticle-diff": "(forskel: $1, $2)",
+       "readonly_lag": "Databasen er automatisk blevet låst mens slavedatabaseserverne synkroniserer med masterdatabasen",
+       "nonwrite-api-promise-error": "HTTP-headeren 'Promise-Non-Write-API-Action' blev sendt, men forespørgslen var til et API-skrivemodul.",
        "internalerror": "Intern fejl",
        "internalerror_info": "Intern fejl: $1",
-       "internalerror-fatal-exception": "Alvorlig undtagelse af typen \"$1\"",
+       "internalerror-fatal-exception": "Fatal undtagelse af typen \"$1\"",
        "filecopyerror": "Kunne ikke kopiere filen \"$1\" til \"$2\".",
        "filerenameerror": "Kunne ikke omdøbe filen \"$1\" til \"$2\".",
        "filedeleteerror": "Kunne ikke slette filen \"$1\".",
        "directorycreateerror": "Kunne ikke oprette mappen \"$1\".",
-       "directoryreadonlyerror": "Folderen \"$1\" er skrivebeskyttet.",
-       "directorynotreadableerror": "Folderen \"$1\" er ikke læsbar.",
+       "directoryreadonlyerror": "Mappen \"$1\" er skrivebeskyttet.",
+       "directorynotreadableerror": "Mappen \"$1\" er ikke læsbar.",
        "filenotfound": "Kunne ikke finde filen \"$1\".",
        "unexpected": "Uventet værdi: \"$1\"=\"$2\".",
-       "formerror": "Fejl: Kunne ikke afsende formular",
+       "formerror": "Fejl: Kunne ikke afsende formular.",
        "badarticleerror": "Denne funktion kan ikke udføres på denne side.",
        "cannotdelete": "Kunne ikke slette siden eller filen \"$1\".\nDen kan være blevet slettet af en anden.",
        "cannotdelete-title": "Kan ikke slette siden \"$1\"",
-       "delete-hook-aborted": "Sletningen blev afbrudt af en programfunktion.\nDer var ikke nogen forklaring.",
+       "delete-hook-aborted": "Sletningen blev afbrudt af en programfunktion.\nDer blev ikke givet nogen forklaring.",
        "no-null-revision": "Kunne ikke oprette nye tom revision for side \"$1\"",
        "badtitle": "Ugyldig titel",
        "badtitletext": "Den ønskede sides titel var ikke tilladt, tom eller siden er forkert henvist fra {{SITENAME}} på et andet sprog.\nDen kan indeholde et eller flere tegn, som ikke må anvendes i titler.",
        "noname": "Du har ikke angivet et gyldigt brugernavn.",
        "loginsuccesstitle": "Logget ind",
        "loginsuccess": "'''Du er nu logget på {{SITENAME}} som \"$1\".'''",
-       "nosuchuser": "Der er ingen bruger med navnet \"$1\".\nDer skelnes mellem store og bogstaver i brugernavne.\nKontrollér stavemåden, eller [[Special:CreateAccount|opret en ny konto]].",
+       "nosuchuser": "Der er ingen bruger med navnet \"$1\".\nDer skelnes mellem store og små bogstaver i brugernavne.\nKontrollér stavningen, eller [[Special:CreateAccount|opret en ny konto]].",
        "nosuchusershort": "Der er ingen bruger ved navn \"$1\". Tjek din stavning.",
        "nouserspecified": "Angiv venligst et brugernavn.",
        "login-userblocked": "Denne bruger er blokeret. Det er ikke tilladt at logge på.",
        "noemail": "Der er ikke oplyst en e-mailadresse for bruger \"$1\".",
        "noemailcreate": "Du skal angive en gyldig e-mailadresse",
        "passwordsent": "En ny adgangskode er sendt til e-mailadressen, som er registreret for \"$1\".\nDu bør logge på og ændre din adgangskode straks efter du har modtaget e-mailen.",
-       "blocked-mailpassword": "Din IP-adresse er blokeret fra at redigere sider. For at forhindre misbrug, er det heller ikke muligt, at bestille en ny adgangskode.",
+       "blocked-mailpassword": "Din IP-adresse er blokeret fra at redigere sider. For at forhindre misbrug er det heller ikke muligt at bestille en ny adgangskode fra denne IP-adresse.",
        "eauthentsent": "En e-mailbekræftelse er sendt til den angivne e-mailadresse.\n\nFør flere e-mails bliver sendt til kontoen, skal du følge instruktionerne i e-mailen, for at bekræfte at kontoen rent faktisk er din.",
        "throttled-mailpassword": "Indenfor {{PLURAL:$1|den sidste time|de sidste $1 timer}} er der allerede sendt en ny adgangskode. For at forhindre misbrug af funktionen, kan der kun bestilles en ny adgangskode én gang for hver {{PLURAL:$1|time|$1 timer}}.",
        "mailerror": "Fejl ved afsendelse af e-mail: $1",
-       "acct_creation_throttle_hit": "Besøgende med samme IP-adresse som dig har oprettet {{PLURAL:$1|en konto|$1 kontoer}} det sidste døgn, og det er ikke tilladt at oprette flere.\nDerfor kan besøgende ikke oprette flere kontoer fra denne IP-adresse i øjeblikket.",
+       "acct_creation_throttle_hit": "Besøgende med samme IP-adresse som dig har oprettet {{PLURAL:$1|1 konto|$1 kontoer}} inden for den/det/de seneste $2, hvilket er det maksimalt tilladte inden for denne tidsperiode.\nDerfor kan besøgende, som bruger denne IP-adresse, ikke oprette flere kontoer fra denne IP-adresse for øjeblikket.",
        "emailauthenticated": "Din e-mailadresse blev bekræftet den $2 kl. $3.",
        "emailnotauthenticated": "Din e-mailadresse er endnu ikke bekræftet.\nIngen e-mail vil blive sendt for de følgende funktioner.",
        "noemailprefs": "Angiv en e-mailadresse, så følgende funktioner er til rådighed.",
        "createaccount-title": "Opret brugerkonto på {{SITENAME}}",
        "createaccount-text": "Nogen har oprettet en konto for din e-mailadresse på {{SITENAME}} ($4) med navnet \"$2\". Adgangskoden er \"$3\".\nDu opfordres til at logge på og ændre adgangskoden med det samme.\n\nDu kan ignorere denne besked hvis kontoen blev oprettet ved en fejl.",
        "login-throttled": "Du har forsøgt at logge på for mange gange.\nVent venligst $1, før du prøver igen.",
-       "login-abort-generic": "Det lykkedes dig ikke at logge på - afbrudt",
+       "login-abort-generic": "Det lykkedes ikke at logge dig på - Afbrudt",
        "login-migrated-generic": "Din konto er blevet globaliseret, og dit brugernavn eksisterer ikke længere på denne wiki.",
        "loginlanguagelabel": "Sprog: $1",
        "suspicious-userlogout": "Din anmodning om at logge af blev nægtet, fordi det ser ud som den blev sendt af en ødelagt browser eller caching proxy.",
        "newpassword": "Ny adgangskode:",
        "retypenew": "Gentag ny adgangskode:",
        "resetpass_submit": "Gem adgangskode og log på",
-       "changepassword-success": "Din adgangskode er nu ændret!",
+       "changepassword-success": "Din adgangskode er blevet ændret!",
        "changepassword-throttled": "Du har forsøgt at logge på for mange gange for nylig.\nVent venligst $1, før du prøver igen.",
        "botpasswords": "Bot adgangskoder",
        "botpasswords-summary": "<em>Bot adgangskoder</em> giver adgang til en brugerkonto via API'en, uden at bruge kontoens normale login-legitimationsoplysninger. Brugerrettighederne kan være begrænset, når du er logget på med et bot password,.\n\nHvis du ikke ved, hvorfor du måske ønsker at gøre dette, bør du nok ikke gøre det. Ingen bør nogensinde bede dig om at generere et af disse, og give det til dem.",
        "resetpass-no-info": "Du skal være logget på for at komme direkte til denne side.",
        "resetpass-submit-loggedin": "Skift adgangskode",
        "resetpass-submit-cancel": "Annuller",
-       "resetpass-wrong-oldpass": "Ugyldig midlertidig eller gældende adgangskode.\nDu har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlertidig kode.",
+       "resetpass-wrong-oldpass": "Ugyldig midlertidig eller gældende adgangskode.\nDu har muligvis allerede ændret din adgangskode eller bedt om en ny midlertidig kode.",
        "resetpass-recycled": "Vær venlig at ændre din adgangskode til noget andet end din nuværende adgangskode.",
        "resetpass-temp-emailed": "Du loggede på med en midlertidig kode tilsendt på e-mail.\nFor at afslutte indlogning skal du angive en ny adgangskode her:",
        "resetpass-temp-password": "Midlertidig adgangskode",
        "selfredirect": "<strong>Advarsel:</strong> Du er ved at omdirigere denne side til sig selv.\nDu kan have angivet det forkerte mål for omdirigeringen, eller du kan være ved at redigere den forkerte side.\nHvis du klikker på \"{{int:savearticle}}\" igen, vil omdirigeringen blive oprettet uanset dette.",
        "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:",
+       "summary-preview": "Forhåndsvisning af sammenfatning:",
        "subject-preview": "Forhåndsvisning af emne/overskrift:",
        "previewerrortext": "Der opstod en fejl under forsøget på at lave en forhåndsvisning af dine ændringer.",
        "blockedtitle": "Du eller din IP-adresse er blokeret",
        "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}}.",
        "revdelete-unsuppress": "Ophæv begrænsninger for gendannede versioner",
        "revdelete-log": "Begrundelse:",
        "revdelete-submit": "Udfør på {{PLURAL:$1|den udvalgte version|de udvalgte versioner}}",
-       "revdelete-success": "'''Versionsvisningen er ændret.'''",
+       "revdelete-success": "Versionssynligheden blev opdateret.",
        "revdelete-failure": "'''Kunne ikke ændre versionssynligheden:'''\n$1",
-       "logdelete-success": "'''Synlighed ændret med success.'''",
+       "logdelete-success": "Log-synligheden blev ændret.",
        "logdelete-failure": "'''Kunne ikke ændre logsynligheden.'''\n$1",
        "revdel-restore": "ændre synlighed",
        "pagehist": "Sidehistorik",
        "search-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:",
        "userrights-user-editname": "Skriv et brugernavn:",
        "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-nodatabase": "Databasen $1 eksisterer ikke lokalt.",
        "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.",
        "group": "Gruppe:",
        "group-user": "Brugere",
        "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",
        "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.",
        "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}}",
        "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):",
        "modifiedarticleprotection": "ændrede beskyttelsen af \"[[$1]]\"",
        "unprotectedarticle": "fjernede beskyttelse af \"[[$1]]\"",
        "movedarticleprotection": "flyttede beskyttelsesindstillinger fra \"[[$2]]\" til \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|beskyttede}} \"[[$1]]\"",
        "protect-title": "Ændre beskyttelse af \"$1\"",
        "protect-title-notallowed": "Få vist beskyttelsesniveauet af \"$1\"",
        "prot_1movedto2": "$1 flyttet til $2",
        "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-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",
        "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",
        "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-protect-modify": "Ændring af beskyttelse",
        "log-action-filter-protect-unprotect": "Fjernede beskyttelse",
        "log-action-filter-protect-move_prot": "Flyttede beskyttelse",
-       "authmanager-provider-temporarypassword": "Midlertidig adgangskode"
+       "authmanager-provider-temporarypassword": "Midlertidig adgangskode",
+       "cannotauth-not-allowed-title": "Adgang nægtet",
+       "cannotauth-not-allowed": "Du har ikke tilladelse til at bruge denne side",
+       "credentialsform-account": "Kontonavn:"
 }
index eed8b37..76f0eea 100644 (file)
        "searcharticle": "Seite",
        "history": "Versionen",
        "history_short": "Versionsgeschichte",
+       "history_small": "Versionsgeschichte",
        "updatedmarker": "Änderung seit deinem letzten Besuch",
        "printableversion": "Druckversion",
        "permalink": "Permanenter Link",
        "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",
        "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",
        "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:",
        "editusergroup": "Benutzergruppen laden",
        "editinguser": "Ändere Benutzerrechte {{GENDER:$1|des Benutzers|der Benutzerin}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Benutzerrechte {{GENDER:$1|des Benutzers|der Benutzerin}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Benutzer-Gruppenzugehörigkeit bearbeiten",
-       "userrights-viewusergroup": "Benutzergruppen ansehen",
+       "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-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.",
        "group": "Gruppe:",
        "group-user": "Benutzer",
        "recentchanges-legend-plusminus": "''(±123)''",
        "recentchanges-submit": "Anzeigen",
        "rcfilters-activefilters": "Aktive Filter",
+       "rcfilters-restore-default-filters": "Standardfilter wiederherstellen",
+       "rcfilters-clear-all-filters": "Alle Filter löschen",
        "rcfilters-search-placeholder": "Letzte Änderungen filtern (durchsuchen oder beginne mit der Eingabe)",
        "rcfilters-invalid-filter": "Ungültiger Filter",
+       "rcfilters-empty-filter": "Keine aktiven Filter. Es werden alle Beiträge angezeigt.",
        "rcfilters-filterlist-title": "Filter",
+       "rcfilters-filterlist-feedbacklink": "Rückmeldung zu den neuen (Beta-)Filtern hinterlassen",
+       "rcfilters-highlightbutton-title": "Ergebnisse hervorheben",
+       "rcfilters-highlightmenu-title": "Eine Farbe auswählen",
+       "rcfilters-highlightmenu-help": "Eine Farbe auswählen, um diese Eigenschaft hervorzuheben.",
        "rcfilters-filterlist-noresults": "Keine Filter gefunden",
+       "rcfilters-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": "Niveau der Benutzererfahrung",
+       "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": "Sehr neue Autoren: Weniger als 10 Bearbeitungen und eine Aktivität von 4 Tagen.",
+       "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 500 Bearbeitungen.",
+       "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-params-json": "JSON-Parameter:",
+       "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.",
        "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}}. {{GENDER:$2|Deine}} E-Mail wird direkt an {{GENDER:$1|den Originalabsender|die Originalabsenderin}} gesendet mit der Preisgabe {{GENDER:$2|deiner}} E-Mail-Adresse an {{GENDER:$1|ihn|sie}}.",
+       "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",
        "rollback-missingparam": "In der Anfrage fehlen erforderliche Parameter.",
        "rollback-missingrevision": "Die Versionsdaten konnten nicht geladen werden.",
        "cantrollback": "Die Änderung kann nicht zurückgesetzt werden, da es keine früheren Autoren gibt.",
-       "alreadyrolled": "Das Zurücksetzen der Änderungen von [[User:$2|$2]] ([[User talk:$2|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) an [[:$1]] ist gescheitert, da in der Zwischenzeit ein anderer Benutzer die Seite geändert hat.\n\nDie letzte Änderung stammt von [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "Das Zurücksetzen der Änderungen von [[User:$2|$2]] ([[User talk:$2|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) an [[:$1]] ist gescheitert, da bereits ein anderer Benutzer die Seite geändert hat.\n\nDie letzte Änderung stammt von [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Die Änderungszusammenfassung lautet: <em>$1</em>.",
        "revertpage": "Änderungen von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) wurden auf die letzte Version von [[User:$1|$1]] zurückgesetzt",
        "revertpage-nouser": "Änderungen von einem versteckten Benutzer rückgängig gemacht und letzte Version von {{GENDER:$1|[[User:$1|$1]]}} wiederhergestellt",
-       "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.",
        "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",
        "pageinfo-few-visiting-watchers": "Es könnte einen beobachtenden Benutzer geben oder nicht, der die letzten Bearbeitungen besucht hat",
        "pageinfo-redirects-name": "Anzahl der Weiterleitungen zu dieser Seite",
        "pageinfo-redirects-value": "$1",
-       "pageinfo-subpages-name": "Unterseiten dieser Seite",
+       "pageinfo-subpages-name": "Anzahl der Unterseiten dieser Seite",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|Weiterleitung|Weiterleitungen}}; $3 {{PLURAL:$3|Unterseite|Unterseiten}})",
        "pageinfo-firstuser": "Seitenersteller",
        "pageinfo-firsttime": "Datum der Seitenerstellung",
        "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-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.",
        "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-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",
        "usercssispublic": "Bitte beachten: CSS-Unterseiten sollten keine vertraulichen Daten enthalten, da sie von anderen Benutzern eingesehen werden können.",
        "restrictionsfield-badip": "Ungültige IP-Adresse oder ungültiger IP-Adressbereich: $1",
        "restrictionsfield-label": "Erlaubte IP-Adressbereiche:",
-       "restrictionsfield-help": "Eine IP-Adresse oder ein CIDR-Bereich pro Zeile. Um alles zu aktivieren, verwende<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "Eine IP-Adresse oder ein CIDR-Bereich pro Zeile. Um alles zu aktivieren, verwende:\n<pre>\n0.0.0.0/0\n::/0\n</pre>",
        "revid": "Version $1",
        "pageid": "Seitenkennung $1"
 }
index 15c3607..d8918e4 100644 (file)
                        "Velg",
                        "1917 Ekim Devrimi",
                        "Gambollar",
-                       "Dılmıc"
+                       "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-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",
@@ -83,7 +84,7 @@
        "editfont-sansserif": "Fontê Sans-serifi",
        "editfont-serif": "Font (çêşıdê nuştey) Serif",
        "sunday": "Kırê",
-       "monday": "Bahdêbazari",
+       "monday": "Dışeme",
        "tuesday": "Sêşeme",
        "wednesday": "Çarşeme",
        "thursday": "Pancşeme",
        "listingcontinuesabbrev": "dewam...",
        "index-category": "Perrê rêzıni",
        "noindex-category": "Perrê bêrêzıni",
-       "broken-file-category": "Perrê  ke gıreyê dosyeyanê ğeletan muhtewa kenê",
+       "broken-file-category": "Perri be linkanê dosya çewte",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Heqa",
        "article": "Wesiqe",
        "newwindow": "(Teqaya newi de abena)",
-       "cancel": "Peyd kı",
+       "cancel": "Annuler",
        "moredotdotdot": "Vêşi...",
        "morenotlisted": "Na lista qay kemi ya.",
        "mypage": "Per",
-       "mytalk": "Vaten",
-       "anontalk": "Vaten",
+       "mytalk": "Werênayış",
+       "anontalk": "Werênayış",
        "navigation": "Pusula",
        "and": "&#32;u",
        "qbfind": "Bıvin",
        "searcharticle": "Şo",
        "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ınustern",
+       "print": "Bınuşne",
        "view": "Bıvin",
        "view-foreign": "$1 de bıvin",
        "edit": "Bıvurne",
        "delete": "Bestern",
        "deletethispage": "Na perrer bestern",
        "undeletethispage": "Na perer mebesterne",
-       "undelete_short": "{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere",
+       "undelete_short": "{{PLURAL:$1|Yew vırnayışi|$1 Vırnayışan}} mestere",
        "viewdeleted_short": "{{PLURAL:$1|Jew vurnayış esternayi|$1 Vurnayışanê esternayan}} bımotne",
        "protect": "Bıstarnê",
        "protect_change": "bıvurne",
-       "protectthispage": "Ena perer bıpawe",
+       "protectthispage": "Ena perre şeveknê",
        "unprotect": "Starnayışi bıvurne",
-       "unprotectthispage": "Starnayışê ena perer bıvurne",
+       "unprotectthispage": "Şeveknayışê ena perre bıvırne",
        "newpage": "Perra newi",
        "talkpage": "Na per dı vatan kew",
        "talkpagelinktext": "Mesac",
-       "specialpage": "Pera hısusi",
+       "specialpage": "Perra xısusiye",
        "personaltools": "Hacetê şexsiy",
        "articlepage": "Pera zerreki bıvin",
-       "talk": "Vaten",
+       "talk": "Werênayış",
        "views": "Asayışi",
        "toolbox": "Haceti",
        "tool-link-userrights": "Grubanê {{GENDER:$1|karberi}} bıvırnë",
        "viewtalkpage": "Vaten bıvin",
        "otherlanguages": "Zıwananê binan dı",
        "redirectedfrom": "($1 ra kırışı yê)",
-       "redirectpagesub": "Pera kırıştışi",
+       "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.",
        "edithelp": "Pastiyer vurnayış",
        "helppage-top-gethelp": "Peşti",
        "mainpage": "Perra Seri",
-       "mainpage-description": "Pera seri",
+       "mainpage-description": "Perra seri",
        "policy-url": "Project:Terzê hereketi",
        "portal": "Portalê cemati",
        "portal-url": "Project:Portalê cemati",
        "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}}",
        "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ê.",
        "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 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",
        "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": "Heyr amey, $1!",
        "welcomecreation-msg": "Hesabê şıma abiyo.\n[[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.",
        "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ê.",
        "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",
        "hr_tip": "Xeta verardiye (teserrufın bıgureyne/bıxebetne)",
        "summary": "Xulasa:",
        "subject": "Mewzu:",
-       "minoredit": "No yew vurnayışo werdiyo",
-       "watchthis": "Bewni ena per",
+       "minoredit": "No yew vırnayışo werdiyo",
+       "watchthis": "Şıma bewnê ena perre",
        "savearticle": "Perre qeyd ke",
-       "savechanges": "Vurnayışan qeyd kı",
+       "savechanges": "Vırnayışan qeyd ke",
        "publishpage": "Perer bıhesırne",
        "publishchanges": "Vurnayışa vıla ke",
        "preview": "Verqayt",
-       "showpreview": "Verasayışi bımotne",
+       "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ê.",
        "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": "'''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).",
        "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ışê şıma qeyd bi.",
        "edit-already-exists": "Pelo newe nêvıraziyeno.\nPel ca ra esto.",
        "defaultmessagetext": "Metnê mesacê hesabiyayey",
        "content-failed-to-parse": "Qandê madela $3 zereyê $1, $2 sero nêagozyayo",
        "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",
        "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",
+       "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 →",
+       "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 qandé  têversanayış işaret ke u dest be ''enter''i ya zi gocega cêrêne rone.<br />\nCetwel: <strong>({{int:ferq}})</strong> = ferqê versiyonê peyêni, <strong>({{int:peyên}})</strong> = ferqê versiyonê verêni, <strong>{{int:q}}</strong> = vurnayışo werdi yo.",
+       "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",
        "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-deleted-text-view": "Çım ra viyarnayışê enê riperri '''vındarnao'''.\nŞıma şenê bıvênê; teferruat nao naca [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış].",
        "rev-suppressed-text-view": "Çımraviyarnayışê ena pele '''degusneyayo'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degusnayış] de teferruat esto.",
        "rev-deleted-no-diff": "Şıma nêşenê nê ferqi bıvênê, çıke çımraviyarnayışan ra  yew '''esteriyo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] de teferruat esto.",
        "rev-suppressed-no-diff": "Revizyon '''esteriyayo\"' aye ra ti nieşkeno ena diff bivine.",
        "diff-multi-otherusers": "(Terefê {{PLURAL:$2|yew karberi|$2 karberan}} ra {{PLURAL:$1|yew revizyono miyanên nêmocno|$1 revizyonê miyanêni nêmocnê}})",
        "diff-multi-manyusers": "({{PLURAL:$1|jew timar kerdışo qıckeko|$1 timar kerdışo qıckeko}} timar kerdo, $2 {{PLURAL:$2|Karber|karberi}} memocne)",
        "difference-missing-revision": "Ferqê {{PLURAL:$2|Yew rewizyonê|$2 rewizyonê}} {{PLURAL:$2|dı|dı}} ($1) sero çıniyo.\n\nNo normal de werênayış dê pelanê besterneyan dı ena xırabin asena.\nDetayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} tiya dı] aseno.",
-       "searchresults": "Peyniyê cıgeyrayışi",
+       "searchresults": "Peyniyê cı geyrayışi",
        "searchresults-title": "Qandê \"$1\" neticeyê geyrayışi",
        "titlematches": "Tekê (zewcê) sernameyê pele",
        "textmatches": "Tekê (zewcê) nuştey pele",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) bıviné",
        "searchmenu-exists": "''Ena 'Wikipediya de ser \"[[:$1]]\" yew pel esto'''",
        "searchmenu-new": "<strong>Na wiki de pela \"[[:$1]]\" vıraze!</strong> {{PLURAL:$2|0=|Sewbina pela ke şıma geyrayê cı aye bıvênê.|Yew zi neticanê cıgeyrayışê xo bıvênê.}}",
-       "searchprofile-articles": "Pelê zerreki",
+       "searchprofile-articles": "Perrê zerreki",
        "searchprofile-images": "Multimedya",
        "searchprofile-everything": "Pêro çi",
        "searchprofile-advanced": "Herayen",
        "search-suggest": "To va: $1",
        "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",
        "search-error": "Cıgeyrayış de yew xeta emê meydan: $1",
        "preferences": "Tercihi",
        "mypreferences": "Tercihi",
-       "prefs-edits": "Amarê vurnayışan:",
+       "prefs-edits": "Amarê vırnayışan:",
        "prefsnologintext2": "Kerem ke, seba vurnayışê tercihanê xo cı kewe.",
        "prefs-skin": "Çerme",
        "skin-preview": "Verqayt",
        "prefs-labs": "Xacetê labs",
        "prefs-user-pages": "Pelê karberi",
        "prefs-personal": "Profilê karberi",
-       "prefs-rc": "Vurnayışê peyêni",
-       "prefs-watchlist": "Liste ya seyr kerdışi",
+       "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": "Listey seyr kerdışê sernameyanê xo bımotné u timar kerê",
        "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.",
        "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-minoredit": "Vurnayışan qıckek nışan bıde.",
+       "right-minoredit": "Vırnayışan zey werdi nışan bıde.",
        "right-move": "Pele bere",
        "right-move-subpages": "Pele be bınpelanê cı ra pia bere",
        "right-move-rootuserpages": "Pelanê kaberiê rıstımi bere",
        "right-deletedtext": "Mabênê newede vurnayışanê esterıtiyan de qaytê nuştey esterıtey u vurnayışan ke",
        "right-browsearchive": "Pelanê esterıteyan bıgeyre",
        "right-undelete": "Yew pela esterıtiye peyser biya",
-       "right-suppressrevision": "İdarekeran ra miyanki, newede vurnayışan de qayt ke u newede vıraze",
+       "right-suppressrevision": "Yew karber ra çım ra viyarnayışanê perran bıvênê, bınımnê u bımocnê.",
        "right-viewsuppressed": "İdarekeran ra miyanki newede vurnayışan de qayt ke",
        "right-suppressionlog": "Rocekanê xasan bıvêne",
        "right-block": "Karberanê binan karê vurnayışi ra bloke bıke",
        "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ê",
        "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-deletelogentry": "roceka dekerdan bestern",
        "action-deletedhistory": "verora esteriya perrer bıvin",
        "action-browsearchive": "pelanê esterıteyan bıgeyre",
-       "action-undelete": "ena perer mestern",
+       "action-undelete": "Ena perre mesterê",
        "action-suppressrevision": "revizyonê nımnayi bıvin u timar kı.",
        "action-suppressionlog": "enê qeydê xısusi bıvêne",
        "action-block": "enê karberi vurnayışi ra bıreyne",
        "action-patrol": "vurnayîşê karberanê binî nişan bike patrol biye",
        "action-autopatrol": "vurnayîşê xoye nişan bike ke belli biyo patrol biye",
        "action-unwatchedpages": "listeyê pelanê seyirnibiya bivîne",
-       "action-mergehistory": "tarixê ena pele yew ke",
+       "action-mergehistory": "tarixê ena perre yew ke",
        "action-userrights": "heqqa karberanê hemî bivurne",
        "action-userrights-interwiki": "heqqa karberanê ke wikiyê binî de hemî bivurne",
        "action-siteadmin": "database kilit bike ya zi a bike",
        "action-sendemail": "e-posta bırşe",
        "action-editmyoptions": "Tercihanê xo bıvurne",
-       "action-editmywatchlist": "Listeyseyran de xo bıvırne",
+       "action-editmywatchlist": "Lista xoya ewniyayışi bıvırnê",
        "action-viewmywatchlist": "Listeyseyran de xo bıvin",
        "action-viewmyprivateinfo": "Xısusi tercihane xo bıvin",
        "action-editmyprivateinfo": "Xısusi malumate xo bıvurne",
        "nchanges": "$1 {{PLURAL:$1|vurnayış|vurnayışi}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ziyaretê peyêni ra nata}}",
        "enhancedrc-history": "tarix",
-       "recentchanges": "Vurnayışê peyêni",
-       "recentchanges-legend": "Tercihê vurnayışanê peyênan",
-       "recentchanges-summary": "Wiki sero vurnayışê 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 yew pela newiye vıraşta.",
-       "recentchanges-label-minor": "No yew vurnayışo werdiyo",
-       "recentchanges-label-bot": "Eno vurnayış terefê yew boti ra vıraziyo",
+       "recentchanges-label-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ı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 sehat $2 ra tepiya vurnayışanê neweyan bımotne",
-       "rcshowhideminor": "Vurnayışê werdiy $1",
+       "rcshowhideminor": "Vırnayışê werdiy $1",
        "rcshowhideminor-show": "Bımotne",
        "rcshowhideminor-hide": "Bınımne",
        "rcshowhidebots": "botan $1",
        "rcshowhidebots-show": "Bımotne",
        "rcshowhidebots-hide": "Bınımne",
-       "rcshowhideliu": "karberanê qeydina $1",
+       "rcshowhideliu": "karberê qeydbiyay $1",
        "rcshowhideliu-show": "Bımotne",
        "rcshowhideliu-hide": "Bınımne",
-       "rcshowhideanons": "karberê bênamey $1",
+       "rcshowhideanons": "$1 karberê bênamey",
        "rcshowhideanons-show": "Bımotne",
        "rcshowhideanons-hide": "Bınımne",
        "rcshowhidepatr": "$1 vurnayışê ke dewriya geyrayê",
        "rcshowhidepatr-show": "Bımotne",
        "rcshowhidepatr-hide": "Bınımne",
-       "rcshowhidemine": "vurnayışê mı $1",
+       "rcshowhidemine": "vırnayışê mı $1",
        "rcshowhidemine-show": "Bımotne",
        "rcshowhidemine-hide": "Bınımne",
        "rcshowhidecategorization": "kategorizasyoni $1",
        "rcshowhidecategorization-show": "Bımotné",
        "rcshowhidecategorization-hide": "Bınımne",
-       "rclinks": "Peyni $2 rocan dı $1 vurriyayışan ra <br />$3 motnênê",
+       "rclinks": "Peyni $2 rocan dı $1 vurnayışan ra <br />$3 bımotnı",
        "diff": "ferq",
        "hist": "verên",
        "hide": "Bınımne",
        "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 perrer:",
        "recentchanges-page-added-to-category": "[[:$1]] kerd kategoriye miyan",
        "recentchanges-page-removed-from-category": "[[:$1]] kategoriye ra vet",
        "autochange-username": "MediaWiki vurnayışo otomatik",
-       "upload": "Dosye bar kı",
-       "uploadbtn": "Dosye bar kı",
+       "upload": "Dosya bar ke",
+       "uploadbtn": "Dosya bar ke",
        "reuploaddesc": "Barkerdışi iptal ke u peyser şo formê barkerdışi",
        "upload-tryagain": "Deskripyonê dosyayî ke vurîya ey qeyd bike",
        "uploadnologin": "Şıma cıkewtış nêvıraşto",
        "largefileserver": "Ena dosya zaf girde ke server kebul nikeno.",
        "emptyfile": "dosya ya ke şıma bar kerda veng asena, nameyê dosyayi şaş nusyaya belka.",
        "windows-nonascii-filename": "Na wiki namen de dosyayan de xısusi karaxtera karkerdışa peşti nêdana.",
-       "fileexists": "Nê nameyi ra yew dosya xora esta. Kerem kerên, <strong>[[:$1]]</strong> qontrol kerê {{GENDER:|şıma}} ke emin niyê naye bıvurnê.   \n[[$1|thumb]]",
+       "fileexists": "Nê namey ra yew dosya xora esta. Kerem kerên, <strong>[[:$1]]</strong> kontrol kerê {{GENDER:|şıma}} ke emin niyê naye bıvurnê.   \n[[$1|thumb]]",
        "filepageexists": "qey na dosya pelê eşkera kerdışi <strong>[[:$1]]</strong> na adresi de ca ra vıraziyayo labele no name de yew dosya nêasena.\nkılmnuşteyê şıma nêasena eke şıma qayili bıvini gani şıma pê dest bıvurni\n[[$1|resimo qıc]]",
        "fileexists-extension": "zey no nameyê dosyayi yewna nameyê dosyayi esta: [[$2|thumb]]\n* dosyaya ke bar biya: <strong>[[:$1]]</strong>\n* dosyaya ke ca ra esta: <strong>[[:$2]]</strong>\nkerem kere yewna name bıvıcinê",
        "fileexists-thumbnail-yes": "na dosya wina asena ke versiyona yew resmê qıc biyayeya ''(thumbnail)''. [[$1|thumb]]\nkerem kerê <strong>[[:$1]]</strong> na dosya konrol bıkerê .",
        "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": "Bıselagnê",
        "unwatchedpages": "Pelanê seyrnibiyeyî",
        "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": "Ena kategoriye dı pela raştameye",
        "randomincategory-invalidcategory": "\"$1\" yew nameyê kategoriya vêrdiye niyo.",
        "randomredirect-nopages": "Cayê nameyê \"$1\" de serşıkıtışi çıniyê.",
        "statistics": "İstatistiki",
        "statistics-header-pages": "İstatistikê perer",
-       "statistics-header-edits": "İstatistikê vurnayışan",
+       "statistics-header-edits": "İstatistikê vırnayışan",
        "statistics-header-users": "İstatistikê karberi",
        "statistics-header-hooks": "Yewbina istatistiki",
        "statistics-articles": "Perê zerreki",
        "protectedtitlesempty": "pê ney parametreyan sernuşteyê pawite çinê",
        "protectedtitles-submit": "Sereki bımotne",
        "listusers": "Listeyê Karberan",
-       "listusers-editsonly": "Teyna karberanê vurnayış kerdoğan bımotne",
+       "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îşî}}",
        "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}}",
        "checkbox-select": "Weçinaye: $1",
        "checkbox-all": "Pêro",
        "checkbox-none": "Temam",
-       "checkbox-invert": "Rageyre",
+       "checkbox-invert": "Verdindayış",
        "allpages": "Pêro peli",
        "nextpage": "Pela badê cû ($1)",
        "prevpage": "Pela verêne ($1)",
        "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",
        "listusers-submit": "Bımotne",
        "listusers-noresult": "karber nêdiyayo/a.",
        "listusers-blocked": "(blok biy)",
-       "activeusers": "Listey karberan de aktivan",
+       "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:",
        "watchlistanontext": "qey vurnayişê maddeya listeya temaşakerdiş ronıştış akerê",
        "watchnologin": "Şıma cıkewtış nêvıraşto",
        "addwatch": "Lista seyrkerdışi ke",
-       "addedwatchtext": "Ma pele \"[[:$1]]\" zerri [[Special:Watchlist|listeya seyri]] tı kerd de.\nEna deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.",
+       "addedwatchtext": "\"[[:$1]]\" u perra cıya werênayışi [[Special:Watchlist|lista şımaya ewniyayışi]] rê ameyo cıkerdış.",
        "addedwatchtext-short": "Pera $1`i çebyê listeya seyran de şıma",
        "removewatch": "Lista seyrkerdışi ra wedare",
        "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": "Bewni ena per",
+       "watchthispage": "Şıma bewnê ena perre",
        "unwatch": "Teqib meke",
        "unwatchthispage": "temaşa kerdışê peli vındarn.",
        "notanarticle": "mebhesê peli niyo",
        "watchlist-hide": "Bınımne",
        "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.",
        "deleteotherreason": "Sebebo bin:",
        "deletereasonotherlist": "Sebebo bin",
        "deletereason-dropdown": "* Sebebê esterıtışê pêroyi\n** Vurnayışo nêwaşte (spam)\n** Vandalizm\n** İxlalê heqa telifi\n** Waştışê nuştoği\n** Oryantasyono xırabe",
-       "delete-edit-reasonlist": "Sebebê vurnayışan bıvurne",
+       "delete-edit-reasonlist": "Sebebê vırnayışan bıvurnê",
        "delete-toobig": "no pel, pê $1 {{PLURAL:$1|tene vuriyayiş|tene vuriyayiş}}i wayirê yew tarixo kehen o.\nqey hewna nêşiyayişi wina pelani u {{SITENAME}}nêxerebnayişê keyepeli yew hed niyaya ro.",
        "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 biyare",
+       "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}}]]).",
+       "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",
        "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'''.",
        "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-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-page": "Pele:",
        "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 dosye",
        "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.",
        "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",
+       "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",
+       "unblocklink": "blokey wedare",
        "change-blocklink": "kılit kerdışi bıvurne",
        "contribslink": "iştıraki",
        "emaillink": "e-poste bırışe",
        "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",
        "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": "Tipê dosyey newey rê pê nêgıneno",
-       "imageinvalidfilename": "nameyê dosyayi ya hedefi meqbul niyo.",
+       "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-preferences": "Tercihê {{GENDER:|şıma}}",
        "tooltip-pt-watchlist": "Listey peranê ke to gırotê seyr kerdış",
        "tooltip-pt-mycontris": "Yew lista iştırakanê {{GENDER:|şıma}}",
        "tooltip-pt-login": "Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo",
        "tooltip-ca-delete": "Ena pele bestere",
        "tooltip-ca-undelete": "Perer fına zey verê esternayışi kerê",
        "tooltip-ca-move": "Ena pele bıkırışe",
-       "tooltip-ca-watch": "Ena pele lista xoya seyrkerdışi ke",
+       "tooltip-ca-watch": "Ena perre lista xoya seyrkerdışi ke",
        "tooltip-ca-unwatch": "Ena pele lista xoya seyrkerdışi ra vece",
        "tooltip-search": "{{SITENAME}} de cı geyre",
        "tooltip-search-go": "Ebe nê namey tami şo yew pela ke esta",
        "tooltip-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ışanê xo çım ra bıviyarnê. Qeydkerdış ra ver bıgurê cı!",
-       "tooltip-diff": "Metni sero vurnayışan mocneno",
+       "tooltip-diff": "Kamci vırnayışê ke şıma nuştey sero kerdê, inan bıvênê.",
        "tooltip-compareselectedversions": "Ena per de ferqê rewziyonan de dı weçinaya bıvinê",
        "tooltip-watch": "Ena pele lista xoya seyrkerdışi ke",
        "tooltip-watchlistedit-normal-submit": "Sernuşteyan wedare",
        "tooltip-preferences-save": "Terciha qeyd ke",
        "tooltip-summary": "Xulasa kılmek bınuse",
        "interlanguage-link-title": "$1 - $2",
-       "common.css": "/************************************************\n * COMMON CSS\n *\n * Any CSS placed in this page will be used on \n * all skins, please think carefully about if it\n * belongs here (and not in one of the skin CSS\n * pages) before adding it. Thanks.\n ************************************************/\n\n/* <table class=\"highlighthovertable\"> */\ntable.highlighthovertable tr:hover,\ntable.highlighthovertable tr:hover td,\ntable.mw-ext-translate-groupstatistics tr:hover,\ntable.mw-ext-translate-groupstatistics tr:hover td {\n background-color: white;\n}\n\n\n/* Babel wrapper layout. */\n/* XXX: This is either redundant or should be in-core */\n/* @noflip */table.mw-babel-wrapper {\n\twidth:        238px;\n\tfloat:        right;\n\tclear:        right;\n\tmargin:       1em;\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: #99B3FF;\n}\n\n/* Babel box layout. */\n/* @noflip */div.mw-babel-box {\n\tfloat:  left;\n\tclear:  left;\n\tmargin: 1px;\n}\n\ndiv.mw-babel-box table {\n\twidth: 238px;\n}\n\ndiv.mw-babel-box table th {\n\twidth:       238px;\n\twidth:       45px;\n\theight:      45px;\n\tfont-size:   14pt;\n\tfont-family: monospace;\n}\n\ndiv.mw-babel-box table td {\n\tfont-size:   8pt;\n\tpadding:     4pt;\n\tline-height: 1.25em;\n}\n\n/* Babel box colours. */\ndiv.mw-babel-box-0 {\n\tborder: solid #B7B7B7 1px;\n}\n\ndiv.mw-babel-box-1 {\n\tborder: solid #C0C8FF 1px;\n}\n\ndiv.mw-babel-box-2 {\n\tborder: solid #77E0E8 1px;\n}\n\ndiv.mw-babel-box-3 {\n\tborder: solid #99B3FF 1px;\n}\n\ndiv.mw-babel-box-4 {\n\tborder: solid #CCCC00 1px;\n}\n\ndiv.mw-babel-box-5 {\n\tborder: solid #F99C99 1px;\n}\n\ndiv.mw-babel-box-N {\n\tborder: solid #6EF7A7 1px;\n}\n\ndiv.mw-babel-box-0 table th {\n\tbackground-color: #B7B7B7;\n}\n\ndiv.mw-babel-box-1 table th {\n\tbackground-color: #C0C8FF;\n}\n\ndiv.mw-babel-box-2 table th {\n\tbackground-color: #77E0E8;\n}\n\ndiv.mw-babel-box-3 table th {\n\tbackground-color: #99B3FF;\n}\n\ndiv.mw-babel-box-4 table th {\n\tbackground-color: #CCCC00;\n}\n\ndiv.mw-babel-box-5 table th {\n\tbackground-color: #F99C99;\n}\n\ndiv.mw-babel-box-N table th{\n\tbackground-color: #6EF7A7;\n}\n\ndiv.mw-babel-box-0 table {\n\tbackground-color: #E8E8E8;\n}\n\ndiv.mw-babel-box-1 table {\n\tbackground-color: #F0F8FF;\n}\n\ndiv.mw-babel-box-2 table {\n\tbackground-color: #D0F8FF;\n}\n\ndiv.mw-babel-box-3 table {\n\tbackground-color: #E0E8FF;\n}\n\ndiv.mw-babel-box-4 table {\n\tbackground-color: #FFFF99;\n}\n\ndiv.mw-babel-box-5 table {\n\tbackground-color: #F9CBC9;\n}\n\ndiv.mw-babel-box-N table {\n\tbackground-color: #C5FCDC;\n}\n\n.babel-box td.babel-footer {\n\ttext-align: center;\n}\n\n/* Styling for portals. */\ndiv.table {\n    display:        table;\n    vertical-align: top;\n    width:          100%;\n}\n\ndiv.table-row {\n    display:        table-row;\n    vertical-align: top;\n}\n\ndiv.table-cell {\n    display:        table-cell;\n    vertical-align: top;\n}\n\nbody.ns-100 table.mw-babel-wrapper {\n    border:           solid 1px #bbbbbb;\n    background-color: #f0f0f0;\n    margin-left:      1em;\n}\n\n.graytext {\n    color: #aaa;\n}\n\n/* On [[Special:RecentChanges]] and [[Special:Watchlist]] make the new pages symbol bold green and the minor edit symbol gray. */\n.newpage {\n    color:       green;\n    font-weight: bold\n}\n\n.minoredit,\n.minor {\n    color: gray;\n}\n\n/* Monospace diffs, this makes more sense since diffs show what would be seen in the edit box. */\n/* Note: Anno 2012 many browsers don't use monospace in the textarea anymore by default, notably Chrome and Safari don't (unless the user overrides this in the preferences) */\n.diff-context,\n.diff-deletedline,\n.diff-addedline {\n    font-family: monospace, \"Courier New\";\n/* Just guess does the stupid wikidiff2 extensions add extra whitespace around..... */\n    white-space: -moz-pre-wrap;\n    white-space: pre-wrap;\n}\n \n.diffchange {\n    border: 1px dotted rgb( 170, 170, 170 );\n}\n\n/* It is unclear what the following CSS does, please add comments if you can clarify. */\n/* The box which is 400px high and if its content is longer, it gets the scrollbar */\n.scrollme {\n    overflow: scroll;\n    width:    100%;\n    height:   400px;\n}\n\n/* Standard Navigationsleisten, aka box hiding thingy from .de.  Documentation at [[Wikipedia:NavFrame]]. */\ndiv.Boxmerge, div.NavFrame { margin: 0; padding: 4px; border-collapse: collapse;}\ndiv.Boxmerge div.NavFrame { border-style: none; border-style: hidden; }\ndiv.NavFrame + div.NavFrame { border-top-style: none; border-top-style: hidden; }\ndiv.NavFrame div.NavHead { height: 1.6em; position:relative; }\ndiv.NavEnd { margin: 0; padding: 0; line-height: 1px; clear: both; }\na.NavToggle { position: absolute; top: 0; right: 5px; }\n.note-flaggedrevs * a.NavToggle { right: 12px; } /* For [[Template:Flagged Revs]] */\n\n/* Template:Languages */\n.bw-languages {\n    border:          1px solid #aaaaaa;\n    padding:         0.2em;\n    border-collapse: collapse;\n    line-height:     1.2;\n    font-size:       95%;\n    margin:          1px 1px;\n}\n.bw-languages-title {\n    width:        180px;\n    border:       1px solid #aaaaaa;\n    background:   #EEF3E2;\n    padding:      0.5em;\n    font-weight:  bold;\n}\n.bw-languages-links { padding:0.5em; background:#F6F9ED; }\n\n/* Senseless in this project */\n#editpage-copywarn { display: none; }\n\n/* Hide warnings about bad links on MediaWiki:Common.css */\n.page-MediaWiki_Common_css .mw-translate-messagechecks { display: none; }\n\n/*******************\n** Faciliate RTL translation\n*******************/\n/* @noflip */\n#bodyContent .arabic a {\n\tpadding-right:0;\n\tbackground:none;\n}\n\n.vatop tr, tr.vatop, .vatop td, .vatop th {\n vertical-align: top;\n}\n\n.bw-languages {\n direction: ltr;\n}\n\n/* prevent wrapping of lines in LQT TOC if not necessary */\ntable.lqt_toc {\n\twidth: auto;\n}\n\n/* [[m:MediaZilla:35337]] */\n@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) {\n        #p-logo a {\n                background-image: url(\"//translatewiki.net/images/thumb/7/7c/Translatewiki-logo-bare.svg/152px-Translatewiki-logo-bare.svg.png\") !important;\n                background-size: auto 135px;\n        }\n}\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 2dppx) {\n        #p-logo a {\n                background-image: url(\"//translatewiki.net/images/thumb/7/7c/Translatewiki-logo-bare.svg/202px-Translatewiki-logo-bare.svg.png\") !important;\n                background-size: auto 135px;\n        }\n}\n\n/* qqq visibility, [[Thread:Support/Suggestion: Add this CSS to MediaWiki:Common.css]] */\n \n.mw-sp-translate-edit-info .mw-content-ltr {\n  background-position:left center;\n  padding-left:45px;\n}\nfieldset.mw-sp-translate-edit-info .mw-centent-rtl {\n  background-position:right center;\n  padding-right:45px;\n}\n\n/* Semantic MediaWiki - make special properties easier to identify */\n\n.smwbuiltin a,\n.smwbuiltin a.new {\n\tcolor: #FF8000;\n}\n\n/* Recentchangestext toggle link */\n.white-link a {\n    color: #fff;\n}",
-       "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
        "anonymous": "{{PLURAL:$1|karberê|karberê}} anonimi yê keyepelê {{SITENAME}}i",
        "siteuser": "karberê {{SITENAME}}i $1",
        "anonuser": "karberê anonim o {{SITENAME}}i $1",
        "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-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-edits": "Amarê vırnayışano pêroyi",
        "pageinfo-authors": "Amarina nuştekaran pêro",
        "pageinfo-recent-edits": "Amariya vurnayışan ($1 ra nata)",
        "pageinfo-recent-authors": "Amarina nuştekaran pêro",
        "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)''",
        "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",
        "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ê vurnayışê dosya",
+       "exif-datetime": "Zeman u tarixê vırnayışê dosya",
        "exif-imagedescription": "Serê resimi",
        "exif-make": "Vıraştoğê kamera",
        "exif-model": "Modelê kamera",
        "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": "Dema  dijital kerdışi",
        "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",
        "fileduplicatesearch-result-1": "Dosyayê ''$1î'' de hem-kopya çini yo.",
        "fileduplicatesearch-result-n": "Dosyayê ''$1î'' de {{PLURAL:$2|1 hem-kopya|$2 hem-kopyayî'}} esto.",
        "fileduplicatesearch-noresults": "Ebe namey \"$1\" ra dosya nêdiyayê.",
-       "specialpages": "Perrê hısusi",
+       "specialpages": "Perrê 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 u heqê inan",
        "specialpages-group-highuse": "Peleyê ke vêşi karênê",
        "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": "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": "Xetay 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-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-stashfailed": "Xırabiya zerrek:Wasteri idari dosyey kerdi vıni.",
        "api-error-publishfailed": "Xetay zerrey: Cıgeyrayoği nêşiya dosya rocane 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-stashfailed": "Xırabiya zerrek:Wasteri idari dosyey kerdi vıni.",
        "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}})",
        "expand_templates_generate_xml": "Dara XML arêdayoği bımocne",
        "expand_templates_generate_rawhtml": "Xam HTML'i bıvin",
        "expand_templates_preview": "Verqayt",
-       "pagelanguage": "Zıwanê perer bıvırnê",
+       "pagelanguage": "Zıwanê perre bıvırnê",
        "pagelang-name": "Pele",
        "pagelang-language": "Zıwan",
        "pagelang-use-default": "Zıwanê hesabiyayeyi bıgurene",
index 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 b6e1b18..cb1e286 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": "प्रोजेक्ट पानो हेर्न्या",
        "invalidtitle-unknownnamespace": "अपछ्याणो नाउँबार अङ्क $1 रे पाठ \"$2\" भया: अमान्य शीर्षक",
        "exception-nologin": "प्रवेश (लग ईन) नगरिएको",
        "exception-nologin-text": "येए पन्नालाई चलुनाइ या केयि काम खिलाइ सक्षम हुनाइ लगइन अर:।",
+       "exception-nologin-text-manual": "येइ पन्‍ना या कारवाइ मी पहुँच समर्थता कि न्यूति कृपया $1 अरऽ।",
        "virus-badscanner": "गट्टी मिलजुल: अपछ्याणो भाइरस खोज्ज्या: <em>$1</em>",
        "virus-scanfailed": "जँचाई असफल(कोड $1)",
        "virus-unknownscanner": "थानभया एन्टीभाइरस:",
        "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": "हो",
        "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": "को सदस्य:",
        "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-upload-upload": "$1 ले $3 {{GENDER:$2|अपलोड अरेका छन्}}",
        "feedback-bugornote": "यदि तमी कुनै प्राविधिक समस्यालाई विस्तारले सम्झाउन तयार छौ भण्या कृपया [$1 बग राख]।\nयदि हैन, भण्या तमी तल दियाको सरल फारमको प्रयोग गद्दसक्द्याहौ । तमरो टिप्पणी, तमरो प्रयोगकर्ता नाम र तमरो ब्राउजरको नाम सहित \"[$3 $2]\" पानामी जोडिन्याछ ।",
        "searchsuggest-search": "{{SITENAME}} खोजऽ",
-       "api-error-duplicate": "यै साइटमी पहिलीबठे यस्तै सामग्री {{PLURAL:$1|भयाको अर्को फाइल छ|भयाका  केहि अरु फाइलहरू छन्}} ।",
-       "api-error-duplicate-archive": "यै साइटमी पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भयाको अर्को फाइल थियो|भयाका केहि अरु फाइलहरू थिए}} ।\nतर {{PLURAL:$1|यो मेट्याको थियो|यी मेटायाका थिए}} ।",
        "expand_templates_preview_fail_html": "<em>किनकि {{SITENAME}} सिधै एचटिएमयल सक्षम छ र तमीले लग इन गर्या छैनौ, पूर्वावलोकन लुकाइयाको छ ताकि सम्भावित जाभास्क्रिप्ट आक्रमणलाई रोक्द सकियोस् ।</em>\n\n<strong>यदि यो मान्य पूर्ववावलोकन प्रयास हो भण्या पुन प्रयास गर ।</strong>\nयदि यसले कार्य पूर्ण भएन भण्या [[Special:UserLogout|लग आउट गरिबर]] फेरी लग इन गर्या ।",
        "expand_templates_preview_fail_html_anon": "<em>किनकि {{SITENAME}} सिधै एचटिएमयल सक्षम छ र तमीले लग इन गर्या छैनौ, पूर्वावलोकन लुकाइयाको छ ताकि सम्भावित जाभास्क्रिप्ट आक्रमणलाई रोक्द सकियोस् ।</em>\n\n<strong>यदि यो मान्य पूर्वावलोकन प्रयास हो भण्या कृपया [[Special:UserLogin|लग इन गरिबर]] पुनः प्रयास गर्या ।</strong>",
        "default-skin-not-found": "ओह! तमरो विकिको पूर्व निर्धारित खोल जस्तो कि <code dir=\"ltr\">$wgDefaultSkin</code> मी बताइयाको<code>$1</code>, उपलब्ध नाईथिन् ।\n\nतमरो इन्स्टलेसन यी खोलहरूलाई सम्मिलित गर्दछ {{PLURAL:$4|खोल|खोलहरू}}। हेर [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: खोललाई सम्मिलित गर्नु] ताकि तमीलाई जानकारी होस् कि कसरि {{PLURAL:$4|उसलाई|उसलाई सम्मिलित गर्न सकियोस् र निर्धारितलाई तय गद्दे}}।\n\n$2\n\n; यदि तमीले अहिले मीडियाविकि इन्स्टाल गर्याका छौ:\n: तमीले सम्भवत गिटबठे इन्स्टाल गर्याका छौ, वा सिधै स्रोत कोडबठे गर्याका छौ जैको लागि कुनै अर्कै तारिका प्रयोग गरियाको छ । यो आशा अनुरूप छ । कोशिश गर केहि खोलहरू\n[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's मीडियाविकिको खोल डाइरेक्ट्रीबाट डाउनलोड गद्या], जैको लागि तमी:\n:* डाउनलोड गर [https://www.mediawiki.org/wiki/Download टरबल इन्स्टालर], जुन कयौं खोलहरू र विस्तारमी उपलब्ध छन्। तमी खोलहरूको कोड <code>skins/</code> त्यसको डाइरेक्ट्रीबाट कपी-पेस्ट गद्द सक्द्या हौ। \n:* व्यक्तिगत खोलहरू टरबलबठे डाउनलोड गर\n[https://www.mediawiki.org/wiki/Special:SkinDistributor मीडिया विकि] बठे।\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins गिटको प्रयोग गरेर डाउनलोड गद्द सकन्छौ]।\n: यदि तमी विकासकर्ता हौ भण्या यसो गद्दा तमरो गिट-रिपजिटरीमी केहि हुनुहुँदैन । \n; यदि तमीले अहिले मीडियाविकिलाई अपग्रेड गर्याका छौ:\n: मीडियाविकि १.२४ र यैको नवीन रूप स्वतः रूपले खोलहरूलाई सक्षम गद्दैनन् (हेर [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual:खोलहरूको स्वतः खोज])। तमी निम्नलिखितलाई पेस्ट गद्द सकन्छौ: {{PLURAL:$5|लाइन|लाइनहरू}}  <code>LocalSettings.php</code> मी ताकि {{PLURAL:$5|उसले|सबै}} सक्षम होस् जस्तो कि तमीले इन्स्टाल गर्याको {{PLURAL:$5|खोल|खोलहरू}}को मामिलामी:\n\n<pre dir=\"ltr\">$3</pre>\n\n; यदि तमीले अहिले परिवर्तन गर्याका छौ<code>LocalSettings.php</code>:\n: खोल नामहरूको अगाडी डबल-क्लिक गर जसले तमलाई विभिन्न प्रकारहरूको विकल्प दिन्छ।"
index 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 3cfb2c2..70705e5 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": "Αποστολή e-mail {{GENDER:$1|στο|στη}} χρήστη",
        "userpage": "Προβολή σελίδας χρήστη",
        "projectpage": "Προβολή σελίδας εγχειρήματος",
        "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": "Î\9aάθε Ï\80αÏ\81αÏ\87Ï\8eÏ\81ηÏ\83η Î´Î¯Î½ÎµÎ¹ Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83Ï\84α Î¿Ï\81ιÏ\83μένα Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\81ήÏ\83Ï\84η Ï\80οÏ\85 Ï\80οÏ\85 Î®Î´Î· Î­Ï\87ει Î­Î½Î±Ï\82 Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Ï\87Ï\81ήÏ\83Ï\84η. Î\94είÏ\84ε Ï\84η [[Special:ListGrants|Ï\80ίνακαÏ\82 παραχωρήσεων]] για περισσότερες πληροφορίες.",
+       "botpasswords-help-grants": "ΠαÏ\81αÏ\87Ï\89Ï\81εί Ï\84ην Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83ε Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\80οÏ\85 Î®Î´Î· ÎºÎ±Ï\84έÏ\87ονÏ\84αι Î±Ï\80Ï\8c Ï\84ο Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Ï\87Ï\81ήÏ\83Ï\84η Ï\83αÏ\82. Î\95νεÏ\81γοÏ\80οίηÏ\83η Î¼Î¹Î±Ï\82 Ï\80αÏ\81αÏ\87Ï\8eÏ\81ηÏ\83ηÏ\82 ÎµÎ´Ï\8e Î´ÎµÎ½ Ï\80αÏ\81έÏ\87ει Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83ε Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\80οÏ\85 Î¿ Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Ï\87Ï\81ήÏ\83Ï\84ηÏ\82 Ï\83αÏ\82 Î´Î¹Î±Ï\86οÏ\81εÏ\84ικά Î´ÎµÎ½ Î¸Î± ÎµÎ¯Ï\87ε. Î\94είÏ\84ε Ï\84ον [[Special:ListGrants|Ï\80ίνακα παραχωρήσεων]] για περισσότερες πληροφορίες.",
        "botpasswords-label-grants-column": "Χορηγήθηκε",
-       "botpasswords-bad-appid": "Î\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-emailsentemail": "Αν αυτή η διεύθυνση ηλεκτρονικού ταχυδρομείου συνδέεται με το  λογαριασμό σας, τότε  θα σας αποσταλεί μήνυμα ηλεκτρονικού ταχυδρομείου για την επαναφορά του κωδικού πρόσβασης.",
        "passwordreset-emailsentusername": "Αν υπάρχει μια διεύθυνση ηλεκτρονικού ταχυδρομείου που συνδέεται με αυτό το όνομα χρήστη, τότε θα σας αποσταλεί ένα μήνυμα ηλεκτρονικού ταχυδρομείου για την επαναφορά του κωδικού πρόσβασης.",
        "passwordreset-invalidemail": "Μη έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου",
+       "passwordreset-nodata": "Δεν δόθηκε όνομα χρήστη ή διεύθυνση email.",
        "changeemail": "Αλλαγή ή αφαίρεση της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
        "changeemail-header": "Συμπληρώστε αυτήν τη φόρμα για να αλλάξετε τη διεύθυνσή σας ηλεκτρονικού ταχυδρομείου. Αν θέλετε να καταργήσετε τη σύνδεση οποιασδήποτε διεύθυνσης ηλεκτρονικού ταχυδρομείου με το λογαριασμό σας, αφήστε τη νέα διεύθυνση ηλεκτρονικού ταχυδρομείου κενή κατά την υποβολή της φόρμας.",
        "changeemail-no-info": "Πρέπει να έχετε συνδεθεί για άμεση πρόσβαση σε αυτήν τη σελίδα.",
        "preview": "Προεπισκόπηση",
        "showpreview": "Εμφάνιση προεπισκόπησης",
        "showdiff": "Εμφάνιση αλλαγών",
-       "blankarticle": "<strong>Προειδοποίηση:</strong> Η σελίδα που δημιουργείτε είναι κενή.\nΕάν κάνετε κλικ στο κουμπί \"{{int:savearticle}}\" και πάλι, η σελίδα θα δημιουργηθεί χωρίς κανένα περιεχόμενο.",
+       "blankarticle": "<strong>Προειδοποίηση:</strong> Η σελίδα που πάτε να δημιουργήσετε είναι κενή.\nΕάν ξανακάνετε κλικ στο κουμπί «{{int:savearticle}}» η σελίδα θα δημιουργηθεί χωρίς περιεχόμενο.",
        "anoneditwarning": "<strong>Προειδοποίηση:</strong> Δεν έχετε συνδεθεί. Η διεύθυνση IP σας θα είναι ορατή δημόσια αν κάνετε κάποια επεξεργασία. Αν <strong>[$1 συνδεθείτε]</strong> ή <strong>[$2 δημιουργήσετε λογαριασμό]</strong>, οι επεξεργασίες σας θα αποδοθούν στο όνομά χρήστη σας, μαζί με άλλα οφέλη.",
        "anonpreviewwarning": "''Δεν έχετε συνδεθεί. Η αποθήκευση θα καταγράψει την διεύθυνσή IP σας στο ιστορικό επεξεργασίας αυτής της σελίδας.''",
        "missingsummary": "'''Υπενθύμιση:''' Δεν έχετε συμπληρώσει τη σύνοψη επεξεργασίας. Αν κάνετε κλικ στο κουμπί Αποθήκευση πάλι, η επεξεργασία σας θα αποθηκευτεί χωρίς σύνοψη.",
        "selfredirect": "<strong>Προσοχή:</strong> Ανακατευθύνετε αυτή τη σελίδα στον εαυτό της. Μπορεί να δώσατε λάθος στόχο για την ανακατεύθυνση, ή μπορεί να επεξεργάζεστε λάθος σελίδα.\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Δεν μπορείτε να χρησιμοποιήσετε την δυνατότητα «αποστολή e-mail σε αυτό το χρήστη» εκτός αν μια έγκυρη ηλεκτρονική διεύθυνση έχει οριστεί στις [[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Σημειώστε ότι δεν μπορείτε να χρησιμοποιήσετε το χαρακτηριστικό \"στείλτε e-mail σε αυτό τον χρήστη\" εκτός αν έχετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου καταχωρημένη στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\n\nΗ τρέχουσα διεύθυνση IP σας είναι $3, και ο αριθμός αναγνώρισης της φραγής σας είναι #$5. Παρακαλώ συμπεριλάβετε τις παραπάνω λεπτομέρειες σε όποια ερωτήματα κάνετε.",
+       "autoblockedtext": "Η διεύθυνση IP σας έχει υποστεί φραγή αυτόματα επειδή χρησιμοποιήθηκε από έναν άλλο χρήστη, ο οποίος και αποκλείστηκε από τον/την $1.\nΗ αιτιολόγηση που δόθηκε είναι η εξής:\n\n:<em>$2</em>\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Επιδιωκόμενος αποκλεισμένος: $7\n\nΜπορείτε να επικοινωνήσετε με τον/την $1 ή με κάποιον από τους άλλους [[{{MediaWiki:Grouppage-sysop}}|διαχειριστές]] για να συζητήσετε τη φραγή.\n\nΝα σημειωθεί ότι δεν μπορείτε να χρησιμοποιήσετε τη λειτουργία «αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου σε αυτόν τον χρήστη» εκτός αν έχετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου καταχωρισμένη στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\n\nΗ τρέχουσα διεύθυνση IP σας είναι $3 και το αναγνωριστικό της φραγής σας είναι #$5. Παρακαλούμε συμπεριλάβετε τις παραπάνω λεπτομέρειες σε όποια ερωτήματα κάνετε.",
+       "systemblockedtext": "Το όνομα χρήστη σας ή η διεύθυνση IP έχει αποκλειστεί αυτόματα από το MediaWiki.\nΗ αιτία που δόθηκε είναι:\n\n:<em>$2</em>\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Στόχος φραγής: $7\n\nΗ τρέχουσα διεύθυνση IP σας είναι $3.\nΠαρακαλούμε να συμπεριλάβετε όλα τα παραπάνω στοιχεία σε τυχόν απορίες σας.",
        "blockednoreason": "δεν δόθηκε λόγος",
        "whitelistedittext": "Πρέπει να $1 για να επεξεργαστείτε σελίδες.",
-       "confirmedittext": "Πρέπει να επιβεβαιώσετε την διεύθυνση 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:''' Εκκαθαρίστε την προσωρινή μνήμη από το μενού ''Εργαλεία → Προτιμήσεις''",
+       "clearyourcache": "<strong>Σημείωση:</strong> μετά την αποθήκευση, ίσως χρειαστεί να παρακάμψετε την προσωρινή μνήμη του προγράμματος περιήγησής σας για να δείτε τις αλλαγές.\n* <strong>Firefox / Safari:</strong> Κρατήστε πατημένο το <em>Shift</em> κάνοντας ταυτόχρονα κλικ στο κουμπί <em>Ανανέωση</em> ή πιέστε <em>Ctrl-F5</em> ή <em>Ctrl-R</em> (<em>⌘-R</em> σε Mac)\n* <strong>Google Chrome:</strong> Πιέστε <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> σε Mac)\n* <strong>Internet Explorer:</strong> Κρατήστε πατημένο το <em>Ctrl</em> κάνοντας ταυτόχρονα κλικ στο κουμπί <em>Ανανέωση</em>, ή πιέστε <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Εκκαθαρίστε την προσωρινή μνήμη από το μενού <em>Εργαλεία → Προτιμήσεις</em>",
        "usercssyoucanpreview": "'''Χρήσιμη συμβουλή:''' Χρησιμοποιήστε το κουμπί \"{{int:showpreview}}\" για να ελέγξτε τα νέα σας CSS πριν τα αποθηκεύσετε.",
        "userjsyoucanpreview": "'''Χρήσιμη συμβουλή:''' Χρησιμοποιήστε το κουμπί \"{{int:showpreview}}\" για να ελέγξτε τη νέα σας JS πριν την αποθηκεύσετε.",
        "usercsspreview": "'''Σας υπενθυμίζουμε ότι κάνετε απλώς έλεγχο/προεπισκόπηση του CSS του χρήστη -δεν το έχετε ακόμα αποθηκεύσει! '''",
        "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": "δείγμα",
        "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-nodatabase": "Η βάση δεδομένων $1 δεν υπάρχει ή δεν είναι τοπική.",
        "userrights-changeable-col": "Ομάδες που μπορείτε να αλλάξετε",
        "userrights-unchangeable-col": "Ομάδες που δεν μπορείτε να αλλάξετε",
-       "userrights-conflict": "Σύγκρουση αλλαγών στα δικαιώματα χρήστη! Παρακαλώ επανεξετάστε και επικυρώστε τις αλλαγές σας.",
+       "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-override-export-depth": "Εξαγωγή σελίδων συμπεριλαμβάνοντας συνδεδεμένες σελίδες έως ένα βάθος 5 επιπέδων",
        "right-sendemail": "Αποστολή ηλεκτρονικού μηνύματος σε άλλους χρήστες",
        "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",
        "watchlistanontext": "Παρακαλούμε συνδεθείτε για να δείτε ή να επεξεργαστείτε αντικείμενα στη λίστα παρακολούθησής σας.",
        "watchnologin": "Δεν έχετε συνδεθεί.",
        "addwatch": "Προσθήκη στη λίστα παρακολούθησης",
-       "addedwatchtext": "Το Î»Î®Î¼Î¼Î± Â«[[:$1]]» ÎºÎ±Î¹ Î· Ï\83ελίδα Ï\83Ï\85ζήÏ\84ηÏ\83ήÏ\82 Ï\84οÏ\85 Î­Ï\87οÏ\85ν Ï\80Ï\81οÏ\83Ï\84εθεί Ï\83Ï\84η [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82]] Ï\83αÏ\82.",
+       "addedwatchtext": "Î\97 Ï\83ελίδα Â«[[:$1]]» ÎºÎ±Î¹ Î· Ï\83ελίδα Ï\83Ï\85ζήÏ\84ηÏ\83ήÏ\82 Ï\84ηÏ\82 Ï\80Ï\81οÏ\83Ï\84έθηκαν Ï\83Ï\84η [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82 Ï\83αÏ\82]].",
        "addedwatchtext-short": "Η σελίδα «$1» έχει προστεθεί στην λίστα παρακολούθησής σας.",
        "removewatch": "Αφαίρεση από τη λίστα παρακολούθησης",
        "removedwatchtext": "Το λήμμα «[[:$1]]» και η σελίδα συζήτησής του έχουν αφαιρεθεί από τη [[Special:Watchlist|λίστα παρακολούθησής]] σας.",
        "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 δεν υπάρχει.",
        "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..bf06e49 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",
+                       "Dr. Shikha Jaggi",
+                       "Xð"
                ]
        },
+       "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": "संपादित करें",
+       "qbpageoptions": "यह पन्ना",
+       "qbmyoptions": "मेरे पृष्ठों",
+       "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 076ce40..b7078dd 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",
        "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.",
        "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",
        "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",
        "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:",
        "editusergroup": "Load user groups",
        "editinguser": "Changing user rights of {{GENDER:$1|user}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Viewing user rights of {{GENDER:$1|user}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Edit user groups",
-       "userrights-viewusergroup": "View user groups",
+       "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-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.",
        "group": "Group:",
        "group-user": "Users",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Show",
        "rcfilters-activefilters": "Active filters",
+       "rcfilters-restore-default-filters": "Restore default filters",
+       "rcfilters-clear-all-filters": "Clear all filters",
        "rcfilters-search-placeholder": "Filter recent changes (browse or start typing)",
        "rcfilters-invalid-filter": "Invalid filter",
+       "rcfilters-empty-filter": "No active filters. All contributions are shown.",
        "rcfilters-filterlist-title": "Filters",
+       "rcfilters-filterlist-feedbacklink": "Provide feedback on the new (beta) filters",
+       "rcfilters-highlightbutton-title": "Highlight results",
+       "rcfilters-highlightmenu-title": "Select a color",
+       "rcfilters-highlightmenu-help": "Select a color to highlight this property",
        "rcfilters-filterlist-noresults": "No filters found",
+       "rcfilters-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": "User experience level",
+       "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": "Very new editors: fewer than 10 edits and 4 days of activity.",
+       "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-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-params-json": "JSON parameters:",
+       "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.",
        "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}}. {{GENDER:$2|Your}} email will be sent directly to the {{GENDER:$1|original sender}}, revealing {{GENDER:$2|your}} email address to {{GENDER:$1|them}}.",
+       "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.",
        "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.",
        "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.",
        "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",
        "usercssispublic": "Please note: CSS subpages should not contain confidential data as they are viewable by other users.",
        "restrictionsfield-badip": "Invalid IP address or range: $1",
        "restrictionsfield-label": "Allowed IP ranges:",
-       "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revision $1",
        "pageid": "page ID $1"
 }
index 2056f6d..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",
        "botpasswords-label-delete": "Forigi",
        "botpasswords-label-resetpassword": "Rekomencigi la pasvorton",
        "botpasswords-label-grants": "Uzeblaj permesdonoj:",
-       "botpasswords-help-grants": "Rajtigiloj permesas aliron al rajtoj jam provizita al via uzantkonto. Ebligi rajtigilojn ĉi tie ne provizas aliron al ajnaj rajtoj ke via uzantkonto ne alie havus. Vidu la [[Special:MyLanguage/Special:ListGrants|tablo de gratifikoj]] 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?",
        "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",
        "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-managechangetags": "Kreado kaj (mal)aktivgo de [[Special:Tags|etikedoj]]",
        "right-applychangetags": "Aldoni [[Special:Tags|etikedojn]] al propraj ŝanĝoj",
        "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",
        "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 ligojn] por [https://eo.wikipedia.org/wiki/Request_for_Comments peto pri komentoj]",
-       "magiclink-tracking-rfc-desc": "Ĉi tiu paĝo uzas magiajn ligojn 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 ligojn por PubMed",
+       "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 ligojn",
-       "magiclink-tracking-isbn-desc": "Ĉi tiu paĝo uzas ISBNajn magiajn ligojn. 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",
        "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}}. {{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}}.",
+       "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",
        "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.",
        "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",
        "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",
        "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>",
+       "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 db9ad30..9a31dbd 100644 (file)
        "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",
        "searcharticle": "Ir",
        "history": "Historial",
        "history_short": "Historial",
+       "history_small": "historial",
        "updatedmarker": "actualizado desde mi última visita",
        "printableversion": "Versión para imprimir",
        "permalink": "Enlace permanente",
        "editsection": "editar",
        "editold": "editar",
        "viewsourceold": "ver código",
-       "editlink": "modificar",
+       "editlink": "editar",
        "viewsourcelink": "ver código",
        "editsectionhint": "Editar sección: $1",
        "toc": "Contenido",
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Función: $1",
        "databaseerror-error": "Error: $1",
-       "transaction-duration-limit-exceeded": "Para evitar la creación de lentitud alta de respuesta, la transacción fue abortada porque la duración de escritura ($1) excedió el límite de $2 {{PLURAL:$2|segundo|segundos}}.\nSi estás cambiando muchos elementos a la vez, trata de hacer operaciones similares más pequeñas.",
+       "transaction-duration-limit-exceeded": "Con el fin de evitar un aumento excesivo del retardo de replicación, se anuló esta transacción porque la duración de escritura ($1) excedió el límite de $2 {{PLURAL:$2|segundo|segundos}}.\nSi estás cambiando muchos elementos a la vez, trata de hacer operaciones similares más pequeñas.",
        "laggedslavemode": "<strong>Advertencia:</strong> puede que falten las actualizaciones más recientes en esta página.",
        "readonly": "Base de datos bloqueada",
        "enterlockreason": "Explica el motivo del bloqueo, incluyendo una estimación de cuándo se producirá el desbloqueo",
        "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.",
        "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",
        "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",
        "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",
        "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:",
        "editusergroup": "Cargar grupos de usuarios",
        "editinguser": "Cambio de los permisos {{GENDER:$1|del usuario|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Visualización de los derechos {{GENDER:$1|del usuario|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modificar grupos {{GENDER:$1|del usuario| de la usuaria}}",
-       "userrights-viewusergroup": "Ver grupos de usuarios",
+       "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-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.",
        "group": "Grupo:",
        "group-user": "Usuarios",
        "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-highlightbutton-title": "Resaltar los resultados",
+       "rcfilters-highlightmenu-title": "Selecciona un color",
+       "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.",
        "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:",
        "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-params-json": "Parámetros JSON:",
+       "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",
        "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}}. {{GENDER:$2|Tu}} correo electrónico se enviará directamente {{GENDER:$1|al emisor|a la emisora}} original, y {{GENDER:$1|le}} revelará {{GENDER:$2|tu}} dirección de correo electrónico.",
+       "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.",
        "editcomment": "El resumen de la edición fue: <em>$1</em>.",
        "revertpage": "Revertidos los cambios de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]]) a la última edición de [[User:$1|$1]]",
        "revertpage-nouser": "Revertidas las ediciones hechas por un usuario oculto a la última revisión hecha por {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Revertidas las ediciones de $1; recuperada la última versión de $2.",
+       "rollback-success": "Revertidas las ediciones de {{GENDER:$3|$1}};\nrecuperada la última versión de {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertidas las ediciones de $1 hasta la última revisión de $2. [$3 Ver cambios]",
        "sessionfailure-title": "Error de sesión",
-       "sessionfailure": "Parece que hay un problema con tu sesión;\nesta acción ha sido cancelada como medida de precaución contra secuestros de sesión.\nPor favor, pulsa «Atrás», recarga la página de la que viniste e inténtalo de nuevo.",
+       "sessionfailure": "Parece que hay un problema con tu sesión;\nse ha cancelado esta acción como medida de precaución contra el robo de sesiones.\nVuelve a la página anterior, recárgala e inténtalo de nuevo.",
        "changecontentmodel": "Cambiar el modelo de contenido de una página",
        "changecontentmodel-legend": "Cambiar el modelo de contenido",
        "changecontentmodel-title-label": "Título de página",
        "sp-contributions-blocked-notice-anon": "Esta dirección IP se encuentra actualmente bloqueada.\nA continuación se muestra la última entrada del registro de bloqueos para mayor referencia.",
        "sp-contributions-search": "Buscar contribuciones",
        "sp-contributions-username": "Dirección IP o nombre de usuario:",
-       "sp-contributions-toponly": "Solo mostrar últimas ediciones de página",
+       "sp-contributions-toponly": "Mostrar solo últimas ediciones de página",
        "sp-contributions-newonly": "Mostrar solo ediciones que son creaciones de páginas",
        "sp-contributions-hideminor": "Ocultar ediciones menores",
        "sp-contributions-submit": "Buscar",
        "reblock-logentry": "cambió el bloqueo para  [[$1]] con una caducidad de $2 $3",
        "blocklogtext": "Esto es un registro de acciones de bloqueo y desbloqueo de usuarios.\nLas direcciones IP bloqueadas automáticamente no aparecen aquí.\nConsulta la [[Special:BlockList|lista de bloqueos]] para ver la lista de bloqueos y prohibiciones de operar en vigor.",
        "unblocklogentry": "desbloqueó a $1",
-       "block-log-flags-anononly": "sólo anónimos",
+       "block-log-flags-anononly": "solo anónimos",
        "block-log-flags-nocreate": "desactivada la creación de cuentas",
        "block-log-flags-noautoblock": "bloqueo automático desactivado",
        "block-log-flags-noemail": "correo electrónico desactivado",
        "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",
        "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",
        "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)",
        "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 gestionar etiquetas de cambio mientras estés {{GÉNERO:$1|bloqueado|bloqueada}}.",
+       "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:",
        "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 un archivo con el nombre «$1» y no se puede sobrescribir.",
-       "api-error-fileexists-shared-forbidden": "Ya existe un archivo con el nombre «$1» en el repositorio de archivos compartido y no se puede sobrescribir.",
-       "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-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",
        "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",
        "usercssispublic": "Recuerda: las subpáginas CSS no deberían contener datos confidenciales, pues otros usuarios los pueden ver.",
        "restrictionsfield-badip": "Dirección o intervalo IP no válidos: $1",
        "restrictionsfield-label": "Intervalos de IP permitidos:",
-       "restrictionsfield-help": "Una dirección IP o intervalo de CIDR por renglón. Para activar todo, utiliza<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "Una dirección IP o intervalo de CIDR por renglón. Para activarlo todo, utiliza <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisión $1",
        "pageid": "ID de página $1"
 }
index 0ab9653..61c6c6b 100644 (file)
        "searcharticle": "Mine",
        "history": "Ajalugu",
        "history_short": "Ajalugu",
+       "history_small": "ajalugu",
        "updatedmarker": "uuendatud pärast viimast külastust",
        "printableversion": "Prinditav versioon",
        "permalink": "Püsilink",
        "createacct-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().",
        "passwordreset-domain": "Domeen:",
        "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.",
        "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:",
        "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",
        "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:",
        "userrights-user-editname": "Sisesta kasutajanimi:",
        "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-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.",
        "group": "Rühm:",
        "group-user": "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-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-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-writeapi": "kirjutamise rakendusliidest kasutada",
        "action-delete": "seda lehekülge kustutada",
        "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": "peidetud redaktsioone vaadata ega taastada",
        "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",
        "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. Sinu kiri saadetakse otse algse kirja saatjale, mistõttu saab ta sinu e-posti aadressi teada.",
+       "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",
        "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": "Tühistati muudatused, mille tegi {{GENDER:$3|$1}};\npöörduti tagasi viimasele muudatusele, mille tegi {{GENDER:$4|$2}}.",
+       "rollback-success-notify": "Tühistatud kasutaja $1 tehtud muudatused;\npöördutud tagasi kasutaja $2 viimase redaktsiooni juurde. [$3 Näita muudatusi]",
        "sessionfailure-title": "Seansiviga",
        "sessionfailure": "Sinu sisselogimisseansiga näib probleem olevat.\nSee toiming on seansiärandamise vastase ettevaatusabinõuna tühistatud.\nMine tagasi eelmisele leheküljele ja taaslaadi see, seejärel proovi uuesti.",
        "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",
        "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",
        "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",
        "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",
        "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",
        "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 →",
        "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-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:",
        "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-date-invalid": "Väärtus, mille ette andsid, pole äratuntav kuupäev. Proovi kasutada vormingut AAAA-KK-PP.",
+       "htmlform-time-invalid": "Väärtus, mille ette andsid, pole äratuntav kellaaeg. Proovi kasutada vormingut TT:MM:SS.",
+       "htmlform-datetime-invalid": "Väärtus, mille ette andsid, pole äratuntav kuupäev ja kellaaeg. Proovi kasutada vormingut AAAA-KK-PP TT:MM:SS.",
+       "htmlform-date-toolow": "Väärtus, mille ette andsid, on enne varaseimat lubatud kuupäeva $1.",
+       "htmlform-date-toohigh": "Väärtus, mille ette andsid, on pärast hiliseimat lubatud kuupäeva $1.",
+       "htmlform-time-toolow": "Väärtus, mille ette andsid, on enne varaseimat lubatud kellaaega $1.",
+       "htmlform-time-toohigh": "Väärtus, mille ette andsid, on pärast hiliseimat lubatud kellaaega $1.",
+       "htmlform-datetime-toolow": "Väärtus, mille ette andsid, on enne varaseimat lubatud kuupäeva ja kellaaega $1.",
+       "htmlform-datetime-toohigh": "Väärtus, mille ette andsid, on pärast hiliseimat lubatud kuupäeva ja kellaaega $1.",
        "htmlform-title-badnamespace": "[[:$1]] pole nimeruumis \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "Pealkirja \"$1\" all ei saa lehekülge alustada.",
        "htmlform-title-not-exists": "Lehekülge $1 pole olemas.",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|uuendas}} leheküljel \"$3\" logisissekande $5 märgiseid ({{PLURAL:$7|lisatud}} $6; {{PLURAL:$9|eemaldatud}} $8)",
        "rightsnone": "(puudub)",
        "revdelete-summary": "resümee",
+       "rightslogentry-temporary-group": "$1 (ajutine, tähtaeg $2)",
        "feedback-adding": "Tagasiside lisamine leheküljele...",
        "feedback-back": "Tagasi",
        "feedback-bugcheck": "Hästi! Kontrolli vaid, ega tegu pole juba [$1 teada oleva veaga].",
        "feedback-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}}",
        "log-action-filter-block-reblock": "Blokeeringu muutmine",
        "log-action-filter-block-unblock": "Blokeeringu tühistamine",
        "log-action-filter-contentmodel-change": "Sisumudeli muudatus",
-       "log-action-filter-contentmodel-new": "Ebastandardse sisumudeliga lehekülje loomine",
+       "log-action-filter-contentmodel-new": "Vaikeväärtusest erineva sisumudeliga lehekülje loomine",
        "log-action-filter-delete-delete": "Lehekülje kustutamine",
        "log-action-filter-delete-delete_redir": "Ümbersuunamise ülekirjutamine",
        "log-action-filter-delete-restore": "Lehekülje taastamine",
        "userjsispublic": "Pea silmas, et JavaScripti alamleheküljed ei tohiks sisaldada konfidentsiaalseid andmeid, kuna neid näevad teised kasutajad.",
        "restrictionsfield-badip": "Vigane IP-aadress või -aadressivahemik: $1",
        "restrictionsfield-label": "Lubatud IP-aadressivahemikud:",
-       "restrictionsfield-help": "Üks IP-aadress või CIDR-vahemik rea kohta. Et lubada kõik, kasuta süntaksit <br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "Üks IP-aadress või CIDR-vahemik rea kohta. Et lubada kõik, kasuta järgmist süntaksit:<pre>0.0.0.0/0\n::/0</pre>"
 }
index 5269c65..b0b5e1f 100644 (file)
@@ -47,7 +47,7 @@
        "tog-watchdeletion": "Ezabatzen ditudan orrialdeak eta fitxategiak nire jarraipen-zerrendara gehitu",
        "tog-watchuploads": "Gehitu igotzen ditudan fitxategiak nire jarraipen zerrendara",
        "tog-watchrollback": "Nire jarraipen zerrendan rollbacka egin dudan orrialdeak erakutsi",
-       "tog-minordefault": "Lehenetsi bezala aldaketa txiki bezala markatu guztiak",
+       "tog-minordefault": "Aukera lehenetsitzat, markatu aldaketa guztiak txikitzat",
        "tog-previewontop": "Aurrebista aldaketa koadroaren aurretik erakutsi",
        "tog-previewonfirst": "Lehen aldaketan aurrebista erakutsi",
        "tog-enotifwatchlistpages": "Bidal iezadazue e-posta bat, jarraitzen ari naizen orrialde edo fitxategi bat aldatzen denean",
        "subcategories": "Azpikategoriak",
        "category-media-header": "Media \"$1\" kategorian",
        "category-empty": "''Kategoria honek ez dauka artikulurik uneotan.''",
-       "hidden-categories": "{{PLURAL:$1|Izkutuko kategoria|Izkutuko kategoriak}}",
+       "hidden-categories": "{{PLURAL:$1|Ezkutuko kategoria|Ezkutuko kategoriak}}",
        "hidden-category-category": "Kategoria ezkutuak",
        "category-subcat-count": "{{PLURAL:$2|Kategoria honek beste honako azpikategoria baino ez du.|Kategoria honek honako {{PLURAL:$1|azpikategoria du|$1 azpikategoriak ditu}}, guztira dauden $2tik.}}",
        "category-subcat-count-limited": "Kategoria honek {{PLURAL:$1|azpikategoria hau du|$1 azpikategoria hauek ditu}}.",
        "searcharticle": "Joan",
        "history": "Orriaren historia",
        "history_short": "Historia",
+       "history_small": "historia",
        "updatedmarker": "nire azkeneko bisitaz geroztik eguneratuta",
        "printableversion": "Inprimatzeko bertsioa",
        "permalink": "Lotura finkoa",
        "views": "Ikustaldiak",
        "toolbox": "Tresnak",
        "tool-link-userrights": "Erabiltzaile {{GENDER:$1|taldea}} aldatu",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Erabiltzailearen}} taldeak  ikusi",
        "tool-link-emailuser": "{{GENDER:$1|Erabiltzale}} honi e-posta bidali",
        "userpage": "Lankide orrialdea ikusi",
        "projectpage": "Proiektuaren orrialdea ikusi",
        "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)",
        "userrights-user-editname": "Erabiltzaile izena idatzi:",
        "editusergroup": "Erabiltzaile taldeak kargatu",
        "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|lankidearen}} erabiltzaile-eskubideak aldatzen",
-       "userrights-editusergroup": "Erabiltzaile taldeak editatu",
+       "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.",
        "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",
        "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",
        "logentry-patrol-patrol": "$1(e)k $3 orrialdearen $4 berrikuspena patruilatutzat {{GENDER:$2|markatu}} du",
        "logentry-newusers-newusers": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
        "logentry-newusers-create": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
-       "logentry-newusers-create2": "$1 wikilariak $3 erabiltzaile kontua sortu du",
+       "logentry-newusers-create2": "$1 wikilariak $3 erabiltzaile kontua {{GENDER:$2|sortu}} du",
        "logentry-newusers-byemail": "$1(e)k $3 erabiltzaile kontua {{GENDER:$2|sortu du}} eta pasahitza emailez bidali da",
+       "logentry-newusers-autocreate": "$1 erabiltzaile kontua automatikoki {{GENDER:$2|sortu da}}",
        "logentry-upload-upload": "$1(e)k $3 {{GENDER:$2|igo du}}",
        "log-name-tag": "Etiketen erregistroa",
        "rightsnone": "(bat ere ez)",
        "feedback-thanks-title": "Eskerrik asko!",
        "searchsuggest-search": "{{SITENAME}} wikian bilatu",
        "searchsuggest-containing": "edukian...",
-       "api-error-badaccess-groups": "Ez duzu baimendik fitxategi hauek wiki honetara igotzeko.",
        "api-error-badtoken": "Barne akatsa: token okerra.",
-       "api-error-empty-file": "Bidali duzun fitxategia hutsik dago.",
        "api-error-emptypage": "Berria sortzerako garaian orrialde hutsak ezin dira erabili.",
-       "api-error-fetchfileerror": "Barne akatsa: zerbait gaizki joan da fitxategia eskuratzerakoan.",
-       "api-error-file-too-large": "Bidali duzun fitxategia handiegia zen.",
-       "api-error-filename-tooshort": "Fitxategiaren izena laburregia da.",
-       "api-error-filetype-banned": "Mota horretako fitxategiak debekatuta daude.",
-       "api-error-filetype-missing": "Fitxategiak ez zuen luzapenik.",
-       "api-error-http": "Barne-errorea: Ezin da zerbitzariarekin konektatu.",
-       "api-error-illegal-filename": "Fitxategiaren izena ez da onartzen.",
-       "api-error-internal-error": "Barne-errorea: Zerbaitek huts egin du zuk wikira igotakoa prozesatzean.",
-       "api-error-invalid-file-key": "Barne-errorea: Ez da fitxategia aurkitu aldi baterako biltegian.",
-       "api-error-missingparam": "Barne-errorea: Parametroak falta dira eskaeran.",
-       "api-error-missingresult": "Barne-errorea: Ezin da zehaztu kopia ondo burutu den ala ez.",
-       "api-error-mustbeloggedin": "Fitxategiak igotzeko izena emanda eduki behar duzu.",
-       "api-error-mustbeposted": "Barne arazoa: HTTP POST beharrezkoa da.",
-       "api-error-noimageinfo": "Igoera ondo egin da, baina zerbitzariak ez digu informaziorik eman zerbitzariaren inguruan.",
-       "api-error-nomodule": "Barne arazoa: igoera modulurik ez dago.",
-       "api-error-ok-but-empty": "Barne arazoa: zerbitzariaren erantzunik ez.",
-       "api-error-overwrite": "Existitzen den fitxategi bat gain-idaztea ez da posible.",
-       "api-error-stashfailed": "Barne arazoa: Zerbitzariak ezin izan du behin-behineko fitxategia gorde",
        "api-error-publishfailed": "Barne-errorea: Zerbitzariak ezin izan du aldi baterako fitxategia gorde.",
-       "api-error-timeout": "Zerbitzariak ez du erantzun espero zitekeen denboran.",
-       "api-error-unclassified": "Ezezaguna den errorea gertatu da.",
-       "api-error-unknown-code": "Akats ezezaguna: \"$1\".",
-       "api-error-unknown-error": "Barne arazoa: fitxategia igotzen saiatzerakoan zerbait gaizki egon da.",
+       "api-error-stashfailed": "Barne arazoa: Zerbitzariak ezin izan du behin-behineko fitxategia gorde",
        "api-error-unknown-warning": "Ohartarazpen ezezaguna: \"$1\".",
        "api-error-unknownerror": "Akats ezezaguna: \"$1\".",
-       "api-error-uploaddisabled": "Wiki honetan ezin dira igoerak egin.",
-       "api-error-verification-error": "Fitxategia ustela izan daiteke, edo fitxategi luzapen ez egokia du.",
        "duration-seconds": "{{PLURAL:$1|Segundu $1|$1 segundu}}",
        "duration-minutes": "{{PLURAL:$1|Minutu $1|$1 minutu}}",
        "duration-hours": "{{PLURAL:$1|Ordu $1|$1 ordu}}",
index 486fc28..1953747 100644 (file)
        "moredotdotdot": "Mas...",
        "morenotlisted": "Esta lista nu está completa",
        "mypage": "Páhina",
-       "mytalk": "La mi caraba",
+       "mytalk": "Caraba",
        "anontalk": "La mi caraba",
        "navigation": "Güiquipeandu",
        "and": "&#32;i",
        "virus-scanfailed": "marru al escrucal virus (cóigu $1)",
        "virus-unknownscanner": "Antivirus andarriu:",
        "logouttext": "'''Cuenta afechá corretamenti.'''<br />\nPueis acontinal gastandu {{SITENAME}} de holma anónima, u <span class='plainlinks'>[$1 entral ena tu cuenta]</span> con el mesmu ussuáriu, u con otru.\nDati cuenta que hata que nu esborris el caché del tu escrucaol pué paecel que la tu cuenta acontina abierta n'angunas páginas.",
-       "yourname": "Nombri d'usuáriu:",
+       "yourname": "Nombri dusuáriu:",
        "yourpassword": "Consínia:",
        "yourpasswordagain": "Escrebi e nuevu la consínia:",
        "yourdomainname": "El tu domiñu:",
        "usercssyoucanpreview": "'''Consehu:''' Gasta el botón 'Previsoreal' pa prebal el tu nuevu CSS enantis d´emburacal.",
        "userjsyoucanpreview": "'''Consehu:''' Gasta el botón 'Previsoreal' pa prebal el tu nuevu JS enantis d´emburacal.",
        "usercsspreview": "'''Alcuerdati que solu estás previsoreandu el tu CSS d'usuáriu.'''\n'''Entovia nu está emburacau!'''",
-       "userjspreview": "'''Recuerda que solu estás prebandu/previsoreandu el tu JavaScript d´usuáriu, entovia nu está emburacau!'''",
+       "userjspreview": "<strong>Recuerda que solu estás prebandu/previsoreandu el tu JavaScript d’usuáriu.\nEntovia nu está emburacau!</strong>",
        "userinvalidcssjstitle": "'''Avisu:''' Nu desisti el skin \"$1\". Alcuerdati que las páhinas presonalizás .css i .js tienin el su entítulu en menúsculas, p.s. {{ns:user}}:Foo/vector.css en lugal de {{ns:user}}:Foo/Vector.css.",
        "updated": "(Atualizau)",
        "note": "'''Nota:'''",
        "template-protected": "(protehiu)",
        "template-semiprotected": "(abati-protehiu)",
        "hiddencategories": "Esta páhina preteneci a {{PLURAL:$1|1 categoria açonchá|$1 categorias açonchás}}:",
-       "edittools": "<!-- Esti testu apaicirá embahu los hormulárius d´eición i empuntu. -->",
+       "edittools": "<!-- Esti testu apaicirá embahu los hormulárius deición i empuntu. -->",
        "nocreatetext": "Nu se premiti crial páhinas nuevas a usuárius anónimus.\nPueis gorvel i eital anguna páhina ya desistenti, u [[Special:UserLogin|rustrilti]].",
        "nocreate-loggedin": "Nu tiés premissu pa crial nuevas páginas.",
        "permissionserrors": "Marrus colos premisus",
        "edit-conflict": "Marru d'eición.",
        "edit-no-change": "La eición nu á siu emburacá, ebiu a que nu s'á hechu dengún chambu nel testu.",
        "edit-already-exists": "Marru al crial la nueva página.\nYa dessisti.",
-       "undo-success": "Se puei eshazel la eición. Enantis d´eshazel la eición, compreba la siguienti comparáncia pa verifical que realmenti es lo que quieis hazel, i altonci, emburaqui los chambus pa, d´esta horma, eshazel la eición.",
+       "undo-success": "Se puei eshazel la eición. Enantis d’eshazel la eición, compreba la siguienti comparáncia pa verifical que realmenti es lo que quieis hazel, i altonci, emburaqui los chambus pa, d’esta horma, eshazel la eición.",
        "undo-failure": "Nu es posibri eshazel la eición ebiu a que otru usuáriu á realizau una eición entelmeya.",
        "undo-norev": "La eición nu pué sel eshecha ebiu a que nu dessisti, u hue esborrá",
        "undo-summary": "Eshazel revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Caraba]])",
        "cantcreateaccount-text": "La criación de cuentas pol parti e la IP ('''$1''') á siu pará pol el usuáriu [[User:$3|$3]].\n\nLa razón dá pol $3 es ''$2''",
        "viewpagelogs": "Vel los rustrihus d’esta páhina",
-       "nohistory": "Nu ai dengún estorial d´eicionis pa esta páhina.",
+       "nohistory": "Nu ai dengún estorial deicionis pa esta páhina.",
        "currentrev": "Revisión atual",
        "currentrev-asof": "Úrtima revisión: $1",
        "revisionasof": "Revisión de $1",
        "history-feed-item-nocomment": "$1 en $2",
        "history-feed-empty": "Esa páhina nu desisti.\nEs posibri qu’aiga siu esborrá e la güiqui, u que s’aiga chambau el su nombri.\nPreba [[Special:Search|landeandu]] entri las nuevas páhinas de la güiqui.",
        "rev-deleted-comment": "(comentáriu esborrau)",
-       "rev-deleted-user": "(nombri d´usuáriu esborrau)",
+       "rev-deleted-user": "(nombri dusuáriu esborrau)",
        "rev-deleted-event": "(entrá esborrá)",
        "rev-deleted-text-permission": "La revisión desta página á siu '''esborrá'''.\nEs possibri que aiga detallis nel [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rustriju d'esborrau].",
        "rev-deleted-text-view": "Esta revisión de la páhina á siu '''esborrá'''.\nCumu alministraol pueis echali una guipaina;\npuei bel detallis nel [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rustriju d'esborrau].",
        "search-external": "Landeu estelnu",
        "searchdisabled": "Los landeus en {{SITENAME}} están temporalmenti desativaus. Mentris tantu, pueis landeal meyanti landerus esternus, inque ten en cuenta que los sus éndicis concernientis a {{SITENAME}} puein nu estal atualizaus.",
        "preferences": "Preferéncias",
-       "mypreferences": "Las mis preferéncias",
+       "mypreferences": "Preferéncias",
        "prefs-edits": "Númiru d'eicionis:",
        "prefs-skin": "Aparéncia",
        "skin-preview": "Previsoreal",
        "prefs-resetpass": "Escambial consínia",
        "saveprefs": "Emburacal",
        "prefs-editing": "Eitandu",
-       "rows": "Filas:",
-       "columns": "Colunas:",
        "searchresultshead": "Landeal",
        "stub-threshold": "Arrayu superiol pa consieral cumu <a href=\"#\" class=\"stub\">atihu a prencipiu</a> (bytes):",
        "recentchangesdays": "Númeru e dias a muestral en \"úrtimus chambus\":",
        "prefs-custom-css": "CSS pressonalizau",
        "prefs-custom-js": "JS pressonalizau",
        "youremail": "Email:",
-       "username": "{{GENDER:$1|Nombri d'usuáriu|Nombri d'usuária}}:",
+       "username": "{{GENDER:$1|Nombri d’usuáriu|Nombri d’usuária}}:",
        "prefs-memberingroups": "Miembru de {{PLURAL:$1|grupu|groupus}}:",
        "yourrealname": "Nombri verdaeru:",
        "yourlanguage": "Palra:",
        "prefs-help-email-required": "Es mestel la direción email.",
        "userrights": "Alministral premisus d'usuárius",
        "userrights-lookup-user": "Alministral grupus d'usuárius",
-       "userrights-user-editname": "Escrebi un nombri d´usuáriu:",
+       "userrights-user-editname": "Escrebi un nombri dusuáriu:",
        "editusergroup": "Eital grupus d'usuárius",
        "editinguser": "Chambandu los derechus del usuáriu '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
        "userrights-editusergroup": "Eital grupus d'usuárius",
        "userrights-reason": "Razón:",
        "userrights-no-interwiki": "Nu tienis premisu pa eital los derechus los usuárius en otras güiquis.",
        "userrights-nodatabase": "La basi e datus $1 nu desisti, u nu es local.",
-       "userrights-nologin": "Ebis [[Special:UserLogin|rustrilti]] con una cuenta d'alministraol pa puel asinal derechus a los usuárius.",
-       "userrights-notallowed": "Nu tienis los permisus nesezárius p'asinal derechus a los usuárius.",
        "userrights-changeable-col": "Grupus que pueis chambal",
        "userrights-unchangeable-col": "Grupus que nu pueis chambal",
        "group": "Grupu:",
        "uploadnologin": "Nu estás rustriu",
        "uploadnologintext": "Ebis estal [[Special:UserLogin|rustriu]]\npa empuntal archivus.",
        "upload_directory_read_only": "Nu puei escrebilsi nel diretoriu d'empuntu ($1) el sirviol.",
-       "uploaderror": "Marru d´empuntu",
+       "uploaderror": "Marru dempuntu",
        "uploadtext": "Gasta el hormuláriu d'embahu pa empuntal archivus, pa vel u landeal imahin ya empuntás vaiti pala [[Special:FileList|lista d'archivus empuntaus]]. Tantu los archivus empuntaus cumu los esborraus se rustrin nel [[Special:Log/upload|rustrihu d'empuntu]].\n\nP'añiil la imahin nuna páhina, gasta el atihu el hormuláriu\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki>''',\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|alt text]]</nowiki>''' u\n'''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki>''' p'atihal diretamenti al archivu.",
        "upload-permitted": "Crasis d'archivus premitias: $1.",
        "upload-preferred": "Crasis d'archivus preferias: $1.",
        "filesource": "Coigu huenti:",
        "ignorewarning": "Inoral el avisihu i emburacal el achivu",
        "ignorewarnings": "Inoral tolos avisihus",
-       "minlength1": "Los nombris d´archivus ebin tenel al menus una letra.",
+       "minlength1": "Los nombris darchivus ebin tenel al menus una letra.",
        "illegalfilename": "El nombri \"$1\" tiini carateris que nu están premitius enus entítulus de páhinas. Pol favol, ponli otru nombri al archivu i preba a empuntalu e nuevu.",
-       "badfilename": "S´á chambau el nombri el archivu a \"$1\".",
+       "badfilename": "S’á chambau el nombri el archivu a «$1».",
        "filetype-badmime": "Nu está premitiu empuntal los archivus MIME type \"$1\".",
        "filetype-unwanted-type": "'''\".$1\"''' es una crassi d'archivu nu deseá. {{PLURAL:$3|La crassi d'archivu preferia es|Las crassis d'archivus preferias son}} $2.",
        "filetype-banned-type": "'''\".$1\"''' nu es una crassi d'archivu premitia.\n{{PLURAL:$3|La crassi d'archivu premitia es|Las crassis d'archivus premitias son}} $2.",
        "fileexists-forbidden": "Ya dessisti un archivu con esti nombri, i nu es possibri sobriescribilu.\nSi entovia quieris empuntal el archivu, pol favol, güervi atrás i empuntalu con otru nombri. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ya dessisti un archivu con esti nombri nel repossitóriu d'archivus compartius;\nSi acontinas queriendu empuntal el archivu, vai alatrás i escambia el nombri el archivu.\n [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Esti archivu es un dupricau {{PLURAL:$1|el siguienti archivu|los siguientis archivus}}:",
-       "uploadwarning": "Avisu d´empuntu",
+       "uploadwarning": "Avisu dempuntu",
        "savefile": "Emburacal archivu",
        "uploaddisabled": "Empuntus desativaus",
        "uploaddisabledtext": "El empuntu d'archivus está desativau.",
        "listfiles-summary": "Esta páhina especial muestra tolos archivus empuntaus.\nPol defetu los úrtimus archivus empuntaus se muestran ena parti arta la lista.\nPursa nel entítulu la coluna pa chambal el ordin.",
        "listfiles_search_for": "Landeal pol nombri la imahin:",
        "imgfile": "archivu",
-       "listfiles": "Lista d´archivus",
+       "listfiles": "Lista darchivus",
        "listfiles_date": "Fecha",
        "listfiles_name": "Nombri",
        "listfiles_user": "Usuáriu",
        "nolinkstoimage": "Nu ai denguna páhina qu’atihi a esti archivu.",
        "morelinkstoimage": "Guipal [[Special:WhatLinksHere/$1|mas atijus]] a esti archivu.",
        "sharedupload": "Esti archivu procei de $1 i puei gastalsi dendi otrus proyeutus.",
-       "uploadnewversion-linktext": "Empuntal una nueva velsión d´esti archivu",
+       "uploadnewversion-linktext": "Empuntal una nueva velsión desti archivu",
        "shared-repo-from": "dendi $1",
        "shared-repo": "un repossitóriu compartiu",
        "filerevert": "Revertil $1",
        "filedelete-intro-old": "Estás esborrandu la velsón de '''[[Media:$1|$1]]''' del [$4 $3 a las $2].",
        "filedelete-comment": "Razón:",
        "filedelete-submit": "Esborral",
-       "filedelete-success": "S´á esborrau '''$1'''.",
+       "filedelete-success": "S’á esborrau <strong>$1</strong>.",
        "filedelete-success-old": "Á siu esborrá la velsión de '''[[Media:$1|$1]]''' del $2 a las $3.</span>",
        "filedelete-nofile": "'''$1''' nu dessisti.",
        "filedelete-nofile-old": "Nu desisti una velsión archivá e '''$1''' con esas caraterísticas.",
        "statistics": "Estaísticas",
        "statistics-header-pages": "Estaísticas de la página",
        "statistics-header-edits": "Estaísticas d'eición",
-       "statistics-header-users": "Estaísticas d´usuáriu",
+       "statistics-header-users": "Estaísticas dusuáriu",
        "statistics-pages": "Páginas",
        "statistics-pages-desc": "Tolas páginas nel wiki, encruyendu carabas, redirecionis...",
        "statistics-files": "Archivus empuntaus",
        "listusers": "Lista d´usuárius",
        "usercreated": "Criá el $1 a las $2",
        "newpages": "Nuevas páhinas",
-       "newpages-username": "Nombri d´usuáriu:",
+       "newpages-username": "Nombri dusuáriu:",
        "ancientpages": "Páhinas mas antiguas",
        "move": "Movel",
        "movethispage": "Movel esta páhina",
        "linksearch-ok": "Landeal",
        "listusersfrom": "Muestral usuárius qu'esmiencin pol:",
        "listusers-submit": "Muestral",
-       "listusers-noresult": "Nu s´alcuentró dengún usuáriu.",
+       "listusers-noresult": "Nu salcuentró dengún usuáriu.",
        "listgrouprights": "Derechus del grupu d'usuárius",
        "listgrouprights-group": "Grupu",
        "listgrouprights-rights": "Derechus",
        "emailsent": "E-mail enviau",
        "emailsenttext": "Se á enviau el tu mensahi pol e-mail.",
        "watchlist": "La mi lista e seguimientu",
-       "mywatchlist": "La mi lista e seguimientu",
+       "mywatchlist": "Lista e seguimientu",
        "nowatchlist": "La tu lista e seguimientu está vacia.",
        "watchlistanontext": "Pa vel u eital las entrás ena tu lista e seguimientu es mestel $1.",
        "watchnologin": "Nu estás rustriu",
        "deletedtext": "S'á esborrau \"$1\" corretamenti.\nConsurta $2 pa vel los úrtimus esborraus.",
        "dellogpage": "Rustrihu d'esborrau",
        "dellogpagetext": "Embahu se muestra una lista colos úrtimus esborraus.",
-       "deletionlog": "rustrihu d´esborrau",
+       "deletionlog": "rustrihu desborrau",
        "reverted": "Revertiu a la úrtima revisión",
        "deletecomment": "Razón:",
        "deleteotherreason": "Otras razonis:",
        "rollback": "Revertil eicionis",
        "rollbacklink": "revertil",
        "rollbackfailed": "Marru revirtiendu",
-       "cantrollback": "Nu se puei eshazel la eición; el úrtimu colabutaol es el únicu autol d´esta páhina.",
+       "cantrollback": "Nu se puei eshazel la eición; el úrtimu colabutaol es el únicu autol desta páhina.",
        "alreadyrolled": "Nu es posibri revertil la úrtima eición de [[:$1]], hecha pol [[User:$2|$2]] ([[User talk:$2|Caraba]]); alguien ya á eitau u revertiu la páhina.\n\nLa úrtima eición á siu hecha pol [[User:$3|$3]] ([[User talk:$3|Caraba]]).",
        "editcomment": "La síntesis la eición hue: <em>$1</em>.",
        "revertpage": "Án siu revertias las eicionis de [[Special:Contributions/$2|$2]] ([[User talk:$2|Caraba]]); chambau a la úrtima velsión de [[User:$1|$1]]",
        "undeletedfiles": "{{PLURAL:$1|1 archivu|$1 archivus}} restauraus",
        "cannotundelete": "Marru arrecuperandu; es posibri qu´alguien ya aiga arrecuperau la páhina.",
        "undeletedpage": "'''S'á restaurau $1'''\n\nConsurta el [[Special:Log/delete|rustrihu d'esborrau]] pa visoreal los úrtimus esborraus i arrecuperacionis.",
-       "undelete-header": "Vaiti pal [[Special:Log/delete|rustrihu d´esborrau]] pa vel las úrtimas páhinas esborrás.",
+       "undelete-header": "Vaiti pal [[Special:Log/delete|rustrihu desborrau]] pa vel las úrtimas páhinas esborrás.",
        "undelete-search-box": "Landeal páhinas esborrás",
        "undelete-search-prefix": "Muestral páhinas qu´esmiencin pol:",
        "undelete-search-submit": "Landeal",
        "blanknamespace": "(Prencipal)",
        "contributions": "Endirguis {{GENDER:$1|el usuáriu|la usuária}}",
        "contributions-title": "Contribucionis del usuáriu a $1",
-       "mycontris": "Los mis endirguis",
+       "mycontris": "Endirguis",
        "contribsub2": "Pa $1 ($2)",
        "nocontribs": "Nu s'alcuentrun chambus con esus criterius.",
        "uctop": "(úrtimu chambu)",
        "sp-contributions-logs": "rustrijus",
        "sp-contributions-talk": "Caraba",
        "sp-contributions-search": "Landeal pol endirguis",
-       "sp-contributions-username": "IP u nombri d´usuáriu:",
+       "sp-contributions-username": "IP u nombri dusuáriu:",
        "sp-contributions-submit": "Landeal",
        "whatlinkshere": "Lo que atija aquina",
        "whatlinkshere-title": "Páhinas que atihan a $1",
        "blockip": "Atarugal usuáriu",
        "blockip-legend": "Atarugal usuáriu",
        "blockiptext": "Gasta el hormuláriu d'embahu p'atarugal el acesu duna IP u dun usuáriu.\nEstu solu ebi hazelsi pa evital el vandalismu, i dalcuerdu cola [[{{MediaWiki:Policy-url}}|póliça]].\nEscrebi una razón concreta embahu (pol sabulugal, almientandu páhinas qu'aigan siu vandalizás pol esti usuáriu).",
-       "ipaddressorusername": "IP u nombri d´usuáriu:",
+       "ipaddressorusername": "IP u nombri dusuáriu:",
        "ipbexpiry": "Acabiha:",
        "ipbreason": "Razón:",
-       "ipbreason-dropdown": "*Motivus frecuentis de tarugus\n** Escrebil enhormación farsa\n** Esborral el continiu las páhinas\n** Añiil publiciá d´otras páhinas...\n** Añiil basura enas páhinas\n** Comportamientu encévicu\n** Abusal con varias cuentas\n** Nombris d´usuárius enacetabris",
+       "ipbreason-dropdown": "*Motivus frecuentis de tarugus\n** Escrebil enhormación farsa\n** Esborral el continiu las páhinas\n** Añiil publiciá d’otras páhinas\n** Añiil basura enas páhinas\n** Comportamientu encévicu\n** Abusal con varias cuentas\n** Nombris d’usuárius enacetabris",
        "ipbcreateaccount": "Atarugal el criaeru e cuentas",
        "ipbemailban": "Atarugal al usuáriu envial emails",
        "ipbenableautoblock": "Atarugal autumáticamenti la direción IP gastá pol esti usuáriu, i cualisquiel IP posteriol endi la cual trati d'eital",
        "blockipsuccesstext": "La direción IP [[Special:Contributions/$1|$1]] á siu atarugá.\n<br />Consurta la [[Special:BlockList|lista d'IP atarugás]] pa visoreal los tarugus.",
        "ipb-edit-dropdown": "Eital las razonis el tarugu",
        "ipb-unblock-addr": "Desatarugal $1",
-       "ipb-unblock": "Desatarugal un nombri d´usuáriu u direción IP",
+       "ipb-unblock": "Desatarugal un nombri dusuáriu u direción IP",
        "ipb-blocklist": "Vel tarugus desistentis",
        "ipb-blocklist-contribs": "Contribucionis de $1",
        "unblockip": "Desatarugal usuáriu",
        "unblockiptext": "Gasta el hormulariu d'embahu pa restablecel el acesu d'escritura a una direción IP u a un nombri d'usuáriu previamenti atarugau.",
        "ipusubmit": "Esborral esti tarugu",
        "unblocked": "El usuáriu [[User:$1|$1]] á siu desatarugau",
-       "unblocked-id": "S´á esborrau el tarugu $1",
+       "unblocked-id": "Sá esborrau el tarugu $1",
        "ipblocklist": "Lista de IP i nombris d'usuárius atarugaus",
        "ipblocklist-legend": "Landeal a un usuáriu atarugau",
        "ipblocklist-submit": "Landeal",
        "createaccountblock": "criaeru e páhinas atarugau",
        "emailblock": "email atarugau",
        "ipblocklist-empty": "La lista e tarugus está vacia.",
-       "ipblocklist-no-results": "Esta direción IP/nombri d´usuáriu nu está atarugau.",
+       "ipblocklist-no-results": "Esta direción IP/nombri dusuáriu nu está atarugau.",
        "blocklink": "atarugal",
        "unblocklink": "desatarugal",
        "change-blocklink": "chambal tarugu",
        "locknoconfirm": "Nu as confirmau lo que te petaria hazel.",
        "lockdbsuccesssub": "Tarugu la basi e datus ativu",
        "unlockdbsuccesssub": "Esborrau el tarugu la basi e datus",
-       "lockdbsuccesstext": "La basi e datus á siu atarugá.\n<br />Alcuerdati d´[[Special:UnlockDB|esborral el tarugu]] cuandu aigas acabihau.",
+       "lockdbsuccesstext": "La basi e datus á siu atarugá.<br />\nAlcuerdati d’[[Special:UnlockDB|esborral el tarugu]] cuandu aigas acabihau.",
        "unlockdbsuccesstext": "S'á desatarugau la basi e datus.",
        "lockfilenotwritable": "El tarugu la basi e datus nu se puei sobriescribil. P'atarugual u desatarugal la basi e datus, esta ebi puel sel escrita pol sirviol web.",
        "databasenotlocked": "La basi e datus nu está atarugá.",
        "importnopages": "Nu ai páhinas pa emporteal.",
        "importfailed": "Marru al emporteal: $1",
        "importcantopen": "Nu se puei abril el archivu emporteau",
-       "importbadinterwiki": "Marru nel atihu d´EntelGüiqui",
+       "importbadinterwiki": "Marru nel atihu dEntelGüiqui",
        "importsuccess": "Archivu emporteau!",
        "importnofile": "Dengún archivu emporteau hue empuntau.",
        "import-parse-failure": "Marru nel análisis d'emporteación XML",
        "tooltip-pt-login": "Te recomendamus que te rustris, inque nu es mestel.",
        "tooltip-pt-logout": "Salil",
        "tooltip-ca-talk": "Caraba al tentu el artículu",
-       "tooltip-ca-edit": "Pueis eital esta página.\nPol favol, gasta el botón \"previsoreal\" enantis d'emburacal.",
+       "tooltip-ca-edit": "Eital esta páhina",
        "tooltip-ca-addsection": "Prencipial una nueva seción",
        "tooltip-ca-viewsource": "Esta páhina está protehia (nu pueis hazel chambus).",
        "tooltip-ca-history": "Velsionis anterioris d'esta página.",
        "file-nohires": "Nu disponibri a mayol resolución.",
        "svg-long-desc": "archivu SVG, $1 × $2 pixelis, grandol: $3",
        "show-big-image": "Resolución máisima",
-       "newimages": "Correol d´archivus nuevus",
+       "newimages": "Correol darchivus nuevus",
        "imagelisttext": "Embahu ai una lista con '''$1''' {{PLURAL:$1|archivu|archivus}} ordenaus $2.",
        "newimages-legend": "Filtru",
        "newimages-label": "Nombri el archivu (u parti):",
        "table_pager_last": "Úrtima páhina",
        "table_pager_limit": "Muestral $1 artículus pol páhina",
        "table_pager_limit_submit": "Dil",
-       "table_pager_empty": "Nu s´alcuentrun resurtaus",
+       "table_pager_empty": "Nu salcuentrun resurtaus",
        "autosumm-blank": "Esborrau el continiu la página",
        "autosumm-replace": "Páhina escambiá pol '$1'",
        "autoredircomment": "Rederihiendu a [[$1]]",
        "watchlistedit-raw-explain": "Se muestran embahu los entítulus de la tu lista e seguimientu, que puein sel eitaus\n\tañiendulus i esborrándulus de la lista; un entítulu pol línia. Cuandu acabihis, pursa sobri \"Atualizal lista e seguimientu\".\n\tTamién pueis [[Special:EditWatchlist|gastal el eitol estándal]].",
        "watchlistedit-raw-titles": "Entítulus:",
        "watchlistedit-raw-submit": "Atualizal la lista e seguimientu",
-       "watchlistedit-raw-done": "La tu lista e seguimientu s´acabiha d´atualizal!",
+       "watchlistedit-raw-done": "La tu lista e seguimientu s’acabiha d’atualizal.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 entítulu hue añiiu|$1 entítulus huerun añiius}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 entítulu hue esborrau|$1 entítulus huerun esborraus}}:",
        "watchlisttools-view": "Vel chambus emportantis",
index f33653a..ff28894 100644 (file)
@@ -56,7 +56,8 @@
                        "Matma Rex",
                        "4nn1l2",
                        "Namo",
-                       "Alifakoor"
+                       "Alifakoor",
+                       "Dejavu"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "searcharticle": "برو",
        "history": "تاریخچهٔ صفحه",
        "history_short": "تاریخچه",
+       "history_small": "تاریخچه",
        "updatedmarker": "به‌روزشده از آخرین باری که سرزده‌ام",
        "printableversion": "نسخهٔ قابل چاپ",
        "permalink": "پیوند پایدار",
        "blockedtitle": "کاربر بسته شده‌است",
        "blockedtext": "<strong>دسترسی حساب کاربری یا نشانی آی‌پی شما بسته شده‌است.</strong>\n\nاین قطع دسترسی توسط $1 انجام شده است.\nدلیل ارائه‌شده چنین است: <em>$2</em>\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «ایمیل به این کاربر» استفاده کنید مگر آنکه آدرس ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
        "autoblockedtext": "دسترسی نشانی آی‌پی شما قطع شده‌است، زیرا این نشانی آی‌پی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شده‌است.\nدلیل ارائه‌شده چنین است:\n\n:''$2''\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «ایمیل به این کاربر» استفاده کنید مگر آنکه نشانی ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
+       "systemblockedtext": "نام کاربری یا نشانی آی‌پی شما خودکار توسط مدیاویکی مسدود شده‌است.\nدلیل ارائه‌شده:\n\n:<em>$2</em>\n\n* آغاز بلاک: $8\n* پایان بلاک: $6\n* قطع دسترسی‌شده مورد نظر: $7\n\nنشانی آی‌پی کنونی شما $3 است.\nخواهشمند است تمام جزئیات بالا را در هر پرس‌وجویی که انجام می‌دهید قرار دهید.",
        "blockednoreason": "دلیلی مشخص نشده‌است",
        "whitelistedittext": "برای ویرایش مقاله‌ها باید $1.",
        "confirmedittext": "شما باید، پیش از ویرایش صفحات، آدرس ایمیل خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.",
        "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": "زبان:",
        "userrights-user-editname": "یک نام کاربری وارد کنید:",
        "editusergroup": "بارگیری گروه‌های کاربر",
        "editinguser": "تغییر اختیارات کاربری کاربر {{GENDER:$1|کاربر}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "ویرایش گروه‌های کاربری",
+       "viewinguserrights": "دیدن دسترسی {{GENDER:$1|کاربری}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "ویرایش گروه‌های {{GENDER:$1|کاربر}}",
+       "userrights-viewusergroup": "مشاهدهٔ گروه‌های {{GENDER:$1|کاربر}}",
        "saveusergroups": "ثبت گروه‌های {{GENDER:$1|کاربری}}",
        "userrights-groupsmember": "عضو:",
        "userrights-groupsmember-auto": "عضو ضمنی:",
-       "userrights-groups-help": "شما می‌توانید گروه‌هایی را که کاربر در آن قرار دارد تغییر دهید:\n* جعبهٔ علامت‌خورده نشانهٔ بودن کاربر در آن گروه است.\n* جعبهٔ خالی نشانهٔ نبودن کاربر در آن گروه است.\n* علامت * به این معنی‌است که اگر آن گروه را بیفزایید نمی‌توانید بعداً برش دارید، و برعکس.",
+       "userrights-groups-help": "شما می‌توانید گروه‌هایی را که کاربر در آن قرار دارد تغییر دهید:\n* جعبهٔ علامت‌خورده نشانهٔ بودن کاربر در آن گروه است.\n* جعبهٔ خالی نشانهٔ نبودن کاربر در آن گروه است.\n* علامت * به این معنی‌است که اگر آن گروه را بیفزایید نمی‌توانید بعداً برش دارید، و برعکس.\n* علامت # را فقط می‌توانید پیش از تاریخ انقضای گروه قرار دهید؛ نمی‌توانید آن را جلو بیاورید.",
        "userrights-reason": "دلیل:",
        "userrights-no-interwiki": "شما اجازهٔ تغییر اختیارات کاربران دیگر ویکی‌ها را ندارید.",
        "userrights-nodatabase": "پایگاه دادهٔ $1 وجود ندارد یا محلی نیست.",
        "userrights-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 day,۱ هفته:1 week,۱ ماه:1 month,۳ ماه:3 months,۶ ماه:6 months,۱ سال:1 year",
+       "userrights-invalid-expiry": "زمان انقضای گروه «$1» نادرست است.",
+       "userrights-expiry-in-past": "زمان انقضای گروه «$1» گذشته‌است.",
+       "userrights-cannot-shorten-expiry": "امکان جلو آوردن تاریخ انقضای گروه  \"$1\" را ندارید. تنها کاربرانی که دسترسی اضافه و حذف این گروه را دارند می‌توانند تاریخ انقضا را جلو بیاورند.",
        "userrights-conflict": "تعارض دسترسی‌های کاربری! لطفاً بررسی کنید و تغییرات را تأیید کنید.",
        "group": "گروه:",
        "group-user": "کاربران",
        "action-upload_by_url": "بارگذاری این پرونده از یک نشانی اینترنتی",
        "action-writeapi": "استفاده از API نوشتن",
        "action-delete": "حذف این صفحه",
-       "action-deleterevision": "حذف این نسخه",
+       "action-deleterevision": "حذف نسخه‌ها",
+       "action-deletelogentry": "حذف سیاههٔ ورودی‌ها",
        "action-deletedhistory": "مشاهدهٔ تاریخچهٔ حذف شدهٔ این صفحه",
+       "action-deletedtext": "مشاهدهٔ متن نسخهٔ حذف‌شده",
        "action-browsearchive": "جستجوی صفحه‌های حذف‌شده",
-       "action-undelete": "احÛ\8cاÛ\8c Ø§Û\8cÙ\86 ØµÙ\81Ø­Ù\87",
+       "action-undelete": "احÛ\8cاÛ\8c ØµÙ\81Ø­Ù\87â\80\8cÙ\87ا",
        "action-suppressrevision": "مشاهده و احیای ویرایش‌های حذف شده",
        "action-suppressionlog": "مشاهدهٔ این سیاههٔ خصوصی",
        "action-block": "قطع دسترسی این کاربر از ویرایش‌کردن",
        "action-userrights-interwiki": "ویرایش اختیارات کاربری کاربران یک ویکی دیگر",
        "action-siteadmin": "قفل‌کردن و بازکردن پایگاه داده‌ها",
        "action-sendemail": "ارسال ایمیل",
+       "action-editmyoptions": "ویرایش ترجیحاتتان",
        "action-editmywatchlist": "فهرست پیگیری‌های خود را ویرایش کنید",
        "action-viewmywatchlist": "فهرست پیگیری‌های خود را ببینید",
        "action-viewmyprivateinfo": "اطلاعات خصوصی خود را ببینید",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات تازه]] نگاه کنید)",
        "recentchanges-legend-plusminus": "(<em>±۱۲۳</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-feedbacklink": "ارسال بازخورد برای پالایه‌های جدید (آزمایشی)",
+       "rcfilters-highlightbutton-title": "پررنگ کردن نتایج",
+       "rcfilters-highlightmenu-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": "فعالیت‌های مدیریتی، ایجاد حساب، حذف صفحه، بارگذاری‌ها ....",
        "rcnotefrom": "در زیر تغییرات از <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شده‌است|نشان داده شده‌اند}}).",
        "rclistfrom": "نمایش تغییرات تازه با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "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بارگذاری پرونده‌های جاوا مجاز نیست، چرا که ممکن است اجازه دور زدن محدودیت‌های امنیتی را بدهند.",
        "uncategorizedcategories": "رده‌های رده‌بندی‌نشده",
        "uncategorizedimages": "پرونده‌های رده‌بندی‌نشده",
        "uncategorizedtemplates": "الگوهای رده‌بندی‌نشده",
+       "uncategorized-categories-exceptionlist": "# شامل فهرست رده‌هایی که باید در ویژه:رده‌های_رده‌بندی‌نشده اصلاح شوند. هر خطی که با \"*\" شروع شده‌است. خطوطی که با نویسه‌های دیگر شروع شده‌اند در نظر گرفته نمی‌شوند (حتی فاصله). برای توضیحات از \"#\" استفاده کنید.",
        "unusedcategories": "رده‌های استفاده‌نشده",
        "unusedimages": "پرونده‌های استفاده‌نشده",
        "wantedcategories": "رده‌های مورد نیاز",
        "apisandbox-sending-request": "ارسال درخواست ای‌پی‌آی...",
        "apisandbox-loading-results": "دریافت درخواست‌های ای‌پی‌آی...",
        "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\"",
        "emailccsubject": "رونوشت پیغام شما به $1: $2",
        "emailsent": "ایمیل ارسال شد",
        "emailsenttext": "پیام ایمیل شما فرستاده شد.",
-       "emailuserfooter": "این ایمیل با استفاده از ویژگی «{{int:emailuser}}» {{SITENAME}} توسط $1 به {{GENDER:$2|$2}} {{GENDER:$1|ارسال شد}}.",
+       "emailuserfooter": "این ایمیل با استفاده از ویژگی «{{int:emailuser}}» {{SITENAME}} توسط $1 به {{GENDER:$2|$2}} {{GENDER:$1|ارسال شد}}.\n\nاگر {{GENDER:$2|شما}} به این ایمیل پاسخ دهید، به {{GENDER:$2|فرستنده}} ایمیل اصلی را ارسال {{GENDER:$1|کنید}}، آدرس ایمیل شما برای {{GENDER:$1|آنها}} ارسال می‌شود.",
        "usermessage-summary": "گذاشتن پیغام سامانه.",
        "usermessage-editor": "پیغام رسان سامانه",
        "watchlist": "فهرست پی‌گیری",
        "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": "عمل انجام شد",
        "editcomment": "خلاصهٔ ویرایش این بود:  <em>«$1»</em>.",
        "revertpage": "ویرایش [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]]) به آخرین تغییری که [[User:$1|$1]] انجام داده بود واگردانده شد",
        "revertpage-nouser": "ویرایش‌های انجام‌شده توسط (نام کاربری حذف شده) به آخرین ویرایش [[User:$1|$1]] واگردانی شد.",
-       "rollback-success": "ویرایش‌های $1 واگردانی شد؛\nصفحه به آخرین ویرایش $2 برگردانده شد.",
+       "rollback-success": "ویرایش‌های {{GENDER:$3|$1}} واگردانی شد؛\nصفحه به آخرین ویرایش {{GENDER:$4|$2}} برگردانده شد.",
        "rollback-success-notify": "ویرایش‌های توسط $1 واگردانی شد؛\nبه آخرین نسخه توسط $2 بازگردانی شد. [$3 نمایش تغییرات]",
        "sessionfailure-title": "خطای نشست کاربری",
        "sessionfailure": "به نظر می‌رسد مشکلی در مورد نشست کاربری شما وجود دارد؛\nعمل درخواست شده در اقدامی پیشگیرانه در برابر ربوده‌شدن اطلاعات نشست کاربری، لغو شد.\nلطفاً دکمهٔ «بازگشت» را در مرورگر خود بفشارید و صفحه‌ای که از آن به اینجا رسیده‌اید را دوباره فراخوانی کنید، سپس مجدداً سعی کنید.",
        "changecontentmodel-emptymodels-title": "هيچ مدل محتوایی در دسترس نيست",
        "changecontentmodel-emptymodels-text": "محتوای موجود در [[:$1]] به هيچ نوعی نمی‌تواند تبديل شود.",
        "log-name-contentmodel": "سیاهه تغییر نمونه محتوی",
-       "log-description-contentmodel": "رÙ\88Û\8cدادÙ\87اÛ\8c Ù\85رتبط Ø¨Ø§ Ù\86Ù\85Ù\88Ù\86Ù\87 Ù\85حتÙ\88Û\8câ\80\8cÙ\87اÛ\8c Û\8cÚ© ØµÙ\81Ø­Ù\87",
+       "log-description-contentmodel": "اÛ\8cÙ\86 ØµÙ\81Ø­Ù\87 ØªØºÛ\8cÛ\8cرات Ù\85حتÙ\88Û\8c ØµÙ\81حاتÛ\8c Ú©Ù\87 Ø¨Ø§ Ù\85حتÙ\88Û\8c ØºÛ\8cر Ø§Ø² Ù¾Û\8cØ´â\80\8cÙ\81رض Ø§Û\8cجاد Ø´Ø¯Ù\87â\80\8cاÙ\86دØ\8c Ø±Ø§ Ù\81Ù\87رست Ù\85Û\8câ\80\8cÚ©Ù\86د.",
        "logentry-contentmodel-new": "صفحهٔ $3 با استفاده از مدل‌های محتوایی غیر پیش‌فرض «$5» توسط $1 {{GENDER:$2|ساخته شد}}",
        "logentry-contentmodel-change": "نمونه محتوای صفحهٔ $3 از \"$4\" به \"$5\" توسط $1 {{GENDER:$2|تغییر داده شد}}",
        "logentry-contentmodel-change-revertlink": "واگردانی",
        "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": "احیای نسخه‌ها",
        "proxyblockreason": "نشانی آی‌پی شما بسته شده است چون متعلق به یک پروکسی باز است.\nلطفاً با ارائه دهندهً خدمات اینترنت خود یا پشتیبانی فنی تماس بگیرید و آنها را از این مشکل امنیتی جدی آگاه کنید.",
        "sorbsreason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده است.",
        "sorbs_create_account_reason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.\nشما اجازهٔ ساختن حساب کاربری ندارید.",
+       "softblockrangesreason": "کاربران ثبت‌نام نکرده نمی‌توانند از IP شما ($1) برای ویرایش استفاده کنند. لطفاً به سامانه وارد شوید.",
        "xffblockreason": "نشانی آی‌پی در X-Forwarded-For header موجود است و پروکسی شما یا سروری که از آن استفاده می‌کنید بسته‌شده‌است. دلیل بسته‌شدن: $1",
        "cant-see-hidden-user": "کاربری که می‌خواهید ببندید قبلاً بسته شده و پنهان گردیده است. چون شما دسترسی پنهان کردن کاربران را ندارید، نمی‌توانید قطع دسترسی کاربر را ببینید یا ویرایش کنید.",
        "ipbblocked": "شما نمی‌توانید دسترسی دیگر کاربران را ببندید یا باز کنید زیرا دسترسی خودتان بسته است.",
        "cant-move-to-user-page": "شما اجازه ندارید که یک صفحه را به یک صفحهٔ کاربر انتقال دهید (به استثنای زیر صفحه‌های کاربری).",
        "cant-move-category-page": "شما اجازهٔ انتقال دادن صفحهٔ رده‌ها را ندارید.",
        "cant-move-to-category-page": "شما مجوز برای انتقال صفحه به صفحه رده ندارید.",
+       "cant-move-subpages": "شما اجازهٔ انتقال دادن زیرصفحات را ندارید.",
+       "namespace-nosubpages": "فضای نام \"$1\" اجازهٔ استفاده یا ایجاد زیرصفحه نمی‌دهد.",
        "newtitle": "عنوان تازه:",
        "move-watch": "پی‌گیری صفحه‌های مبدأ و مقصد",
        "movepagebtn": "صفحه منتقل شود",
        "pageinfo-length": "حجم صفحه  (بایت)",
        "pageinfo-article-id": "شناسهٔ صفحه",
        "pageinfo-language": "زبان محتوای صفحه",
+       "pageinfo-language-change": "تغییر",
        "pageinfo-content-model": "ساختار محتوای صفحه",
        "pageinfo-content-model-change": "تغییر",
        "pageinfo-robot-policy": "‌فهرست‌کردن توسط ربات‌ها",
        "logentry-tag-update-logentry": "$1 برچسب سیاههٔ $5 صفحهٔ $3 را {{GENDER:$2|به‌روز کرد}} ($6 {{PLURAL:$7|افزوده‌شد}}؛ $8 {{PLURAL:$9|حذف شد}})",
        "rightsnone": "(هیچ)",
        "revdelete-summary": "خلاصه ویرایش",
+       "rightslogentry-temporary-group": "$1 (موقت، تا $2)",
        "feedback-adding": "افزودن بازخورد به صفحه...",
        "feedback-back": "بازگشت",
        "feedback-bugcheck": "عالی‌است! فقط بررسی کنید که از [$1 ایرادهای شناخته‌شده] نباشد.",
        "feedback-useragent": "رابط کاربر:",
        "searchsuggest-search": "جستجو در {{SITENAME}}",
        "searchsuggest-containing": "صفحه‌های دربردارنده...",
-       "api-error-autoblocked": "نشانی آی‌پی شما به صورت خودکار بسته شده‌است، چون توسط یک کاربر بسته‌شده استفاده می‌شد.",
-       "api-error-badaccess-groups": "شما اجازهٔ بارگذاری پرونده‌ها را در این ویکی ندارید.",
        "api-error-badtoken": "خطای داخلی: کد امنیتی اشتباه (Bad token).",
-       "api-error-blocked": "شما از ویرایش بسته شده‌اید.",
-       "api-error-copyuploaddisabled": "بارگذاری با استفاده از نشانی اینترنتی در این کارساز غیرفعال است.",
-       "api-error-duplicate": "{{PLURAL:$1|پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت.",
-       "api-error-duplicate-archive": "{{PLURAL:$1| پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت، ولی حذف {{PLURAL:$1|شده است|شده‌اند}}.",
-       "api-error-empty-file": "پرونده‌ای که شما ارسال کردید خالی بود.",
        "api-error-emptypage": "ایجاد صفحه‌های خالی مجاز نیست.",
-       "api-error-fetchfileerror": "خطای داخلی: در هنگام گرفتن پرونده، یک چیزی درست پیش نرفت.",
-       "api-error-fileexists-forbidden": "یک پرونده با نام \"$1\" موجود است و امکان بازنویسی نیست.",
-       "api-error-fileexists-shared-forbidden": "یک پرونده با نام \"$1\" در انبار اشتراک پرونده موجود است و امکان بازنویسی نیست.",
-       "api-error-file-too-large": "پرونده‌ای که شما ارسال کردید بیش از اندازه بزرگ بود.",
-       "api-error-filename-tooshort": "نام پرونده بیش از اندازه کوتاه است.",
-       "api-error-filetype-banned": "این نوع پرونده ممنوع است.",
-       "api-error-filetype-banned-type": "&lrm;$1 {{PLURAL:$4|یک نوع پروندهٔ نامجاز است|انواع پروندهٔ نامجاز هستند}}. {{PLURAL:$3|نوع پروندهٔ مجاز|انواع پروندهٔ مجاز}} از این قرار است: $2.",
-       "api-error-filetype-missing": "پرونده فرمت ندارد.",
-       "api-error-hookaborted": "اصلاحیه‌ای که شما سعی در ایجاد آن بودید توسط افزونه‌ای به دام افتاد.",
-       "api-error-http": "خطای داخلی: قادر به اتصال به سرور نیست.",
-       "api-error-illegal-filename": "نام پرونده مجاز نیست.",
-       "api-error-internal-error": "خطای داخلی: با پردازش بارگذاری شما در ویکی، یک چیز اشتباه پیش رفت.",
-       "api-error-invalid-file-key": "خطای داخلی: پرونده در حافظهٔ موقت موجود نیست.",
-       "api-error-missingparam": "خطای داخلی: پارامترهای ناموجود در درخواست.",
-       "api-error-missingresult": "خطای داخلی: نمی‌توان فهمید کپی‌برداری موفق بوده‌است یا نه.",
-       "api-error-mustbeloggedin": "برای بارگذاری پرونده‌ها شما باید به سامانه وارد شوید.",
-       "api-error-mustbeposted": "خطای داخلی: درخواست باید از روش POST HTTP ارسال گردد.",
-       "api-error-noimageinfo": "بارگذاری موفق بود، ولی کارساز هیچ اطلاعاتی دربارهٔ پرونده به ما نداد.",
-       "api-error-nomodule": "خطای داخلی: پودمان بارگذاری تنظیم نشده‌است.",
-       "api-error-ok-but-empty": "خطای داخلی : پاسخی از سرور دریافت نشد.",
-       "api-error-overwrite": "جای نوشتن یک پرونده موجود مجاز نیست.",
-       "api-error-ratelimited": "شما سعی داريد، در بازه زمانی کوتاهی، بيشتر از تعدادی که اين ويکی اجازه داده‌است پرونده بارگذاری کنيد.\nلطفاً چند دقيقه بعد مجدداً تلاش نماييد.",
-       "api-error-stashfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
        "api-error-publishfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
-       "api-error-stasherror": "هنگام انتقال پوشه برای ذخیره خطایی بود.",
-       "api-error-stashedfilenotfound": "زمانی که تلاش برای بارگذاری فایل استش بود، فایل استش یافت نشد.",
-       "api-error-stashpathinvalid": "مسیری که فایل استش در آن باید یافت می‌شد اشتباه است.",
-       "api-error-stashfilestorage": "برای ذخیرهٔ فایل استش خطایی رخ داده است.",
-       "api-error-stashzerolength": "سرور نمی‌تواند فایل استش را ذخیره کند چون حجم آن صفر است.",
-       "api-error-stashnotloggedin": "برای ذخیرهٔ فایل‌ها در بارگذاری استش باید وارد سامانه شده‌باشید.",
-       "api-error-stashwrongowner": "فایلی که در استش قصد داشتید به آن دسترسی داشته‌باشید متعلق به شما نیست.",
-       "api-error-stashnosuchfilekey": "کلیدی که در فایل استش می خواستید به آن دسترسی داشته‌باشید، وجود ندارد.",
-       "api-error-timeout": "کارساز در زمان انتظار هیچ پاسخی نداد.",
-       "api-error-unclassified": "یک خطای ناشناخته رخ داد.",
-       "api-error-unknown-code": "خطای ناشناخته: \" $1 \"",
-       "api-error-unknown-error": "خطای داخلی: در زمانی که شما در حال تلاش برای بارگذاری پروندهٔ‌تان بودید، یک چیز اشتباه پیش رفت.",
-       "api-error-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 ثانیه",
        "duration-minutes": "$1 دقیقه",
        "duration-hours": "$1 ساعت",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|بایت|بایت}}",
        "limitreport-expansiondepth": "بیشترین عمق گسترش",
        "limitreport-expensivefunctioncount": "تعداد تابع تجزیه‌گر پرمصرف",
-       "expandtemplates": "بسطدادن الگوها",
+       "expandtemplates": "بسط دادن الگوها",
        "expand_templates_intro": "این صفحهٔ ویژه متنی را دریافت کرده و تمام الگوهای به‌کاررفته در آن را به طور بازگشتی بسط می‌دهد. همچنین تابع‌های تجزیه چون <code><nowiki>{{</nowiki>#language:…}}</code> و متغیرهایی چون  <code><nowiki>{{</nowiki>CURRENTDAY}}</code> را هم بسط می‌دهد — در واقع تقریباً هرچه را که داخل دوآکولاد باشد. این کار با صدازدن مرحلهٔ تجزیهٔ مربوط در خود مدیاویکی صورت می‌گیرد.",
        "expand_templates_title": "عنوان موضوع، برای {{FULLPAGENAME}} و غیره:",
        "expand_templates_input": "متن ورودی:",
        "pagelang-language": "زبان",
        "pagelang-use-default": "استفاده از زبان پیش‌فرض",
        "pagelang-select-lang": "انتخاب زبان",
+       "pagelang-reason": "دلیل",
        "pagelang-submit": "اعمال",
+       "pagelang-nonexistent-page": "صفحهٔ $1 وجود ندارد.",
+       "pagelang-unchanged-language": "صفحهٔ $1 برای زبان $2 تنظیم شده‌است.",
+       "pagelang-unchanged-language-default": "صفحهٔ $1 برای محتوی زبانی پیش‌فرض ویکی، تعریف شده‌است.",
+       "pagelang-db-failed": "پایگاه داده برای تغییر زبان صفحه خطا داد.",
        "right-pagelang": "تغییر صفحهٔ زبان",
        "action-pagelang": "تغییر زبان صفحه",
        "log-name-pagelang": "سیاههٔ تغییر زبان",
        "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": "تغییر نوع contentmodel:",
+       "log-action-filter-contentmodel": "نوع تغییرات مدل محتوا:",
        "log-action-filter-delete": "نوع حذف:",
        "log-action-filter-import": "نوع واردات",
        "log-action-filter-managetags": "نوع مدیریت",
        "log-action-filter-block-reblock": "تصحیح بلاک",
        "log-action-filter-block-unblock": "باز شدن",
        "log-action-filter-contentmodel-change": "تغییر مدل محتوا",
-       "log-action-filter-contentmodel-new": "ایجاد صفحه با contentmodel غیر استاندارد",
+       "log-action-filter-contentmodel-new": "ایجاد صفحه با مدل محتوای غیر استاندارد",
        "log-action-filter-delete-delete": "حذف صفحه",
        "log-action-filter-delete-delete_redir": "رونویسی تغییرمسیر",
        "log-action-filter-delete-restore": "احیای صفحه",
        "usercssispublic": "لطفاً توجه کنید: زیرصفحه‌های سی‌اس‌اس نباید حاوی اطلاعات محرمانه باشند چون توسط دیگران قابل مشاهده هستند.",
        "restrictionsfield-badip": "نشانی یا بازهٔ آی‌پی نامعتبر: $1",
        "restrictionsfield-label": "بازه‌های آی‌پی مجاز:",
-       "restrictionsfield-help": "یک نشانی آی‌پی یا بازهٔ سی‌آی‌دی‌ار در هر خط وارد کنید. برای فعال کردن همه‌چیز، این مقدار را استفاده کنید: <code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "یک نشانی آی‌پی یا بازهٔ سی‌آی‌دی‌ار در هر خط وارد کنید. برای فعال کردن همه‌چیز، این مقدار را استفاده کنید: <code>0.0.0.0/0</code><br /><code>::/0</code>",
+       "revid": "نسخهٔ $1",
+       "pageid": "شناسهٔ صفحهٔ $1"
 }
index fdd94bc..aa1e090 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",
        "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",
        "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",
        "editusergroup": "Lataa käyttäjäryhmät",
        "editinguser": "Muutetaan {{GENDER:$1|käyttäjän}} <strong>[[User:$1|$1]]</strong> $2 oikeuksia",
        "viewinguserrights": "Näytetään {{GENDER:$1|käyttäjän}} <strong>[[User:$1|$1]]</strong> $2 käyttäjäryhmät",
-       "userrights-editusergroup": "Muuta käyttäjän ryhmiä",
-       "userrights-viewusergroup": "Näytä käyttäjäryhmät",
+       "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-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.",
        "group": "Ryhmä",
        "group-user": "käyttäjät",
        "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-restore-default-filters": "Palauta oletussuodattimet",
+       "rcfilters-clear-all-filters": "Tyhjennä kaikki suodattimet",
+       "rcfilters-search-placeholder": "Suodattimen viimeaikaiset muutokset (selaa tai aloita kirjoittaa)",
+       "rcfilters-invalid-filter": "Suodatin on epäkelpo",
+       "rcfilters-empty-filter": "Ei aktiivisia suodattimia. Kaikki muutokset näytetään.",
+       "rcfilters-filterlist-title": "Suodattimet",
+       "rcfilters-highlightmenu-title": "Valitse väri",
+       "rcfilters-filterlist-noresults": "Ei löytynyt suodattimia",
+       "rcfilters-filtergroup-registration": "Käyttäjän rekisteröinti",
+       "rcfilters-filter-registered-label": "Rekisteröitynyt",
+       "rcfilters-filter-registered-description": "Kirjautuneet muokkaukset.",
+       "rcfilters-filter-unregistered-label": "Rekisteröimätön",
+       "rcfilters-filter-unregistered-description": "Muokkaajat, jotka eivät ole kirjautuneet sisään.",
+       "rcfilters-filter-editsbyself-label": "Omat muokkauksesi",
+       "rcfilters-filter-editsbyself-description": "Muokkauksesi",
+       "rcfilters-filter-editsbyother-label": "Muiden muokkaukset",
+       "rcfilters-filter-editsbyother-description": "Muutokset jotka tehneet muut käyttäjät (et sinä).",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Tulokkaat",
+       "rcfilters-filter-userExpLevel-learner-label": "Oppijat",
+       "rcfilters-filter-userExpLevel-experienced-label": "Kokeneet käyttäjät",
+       "rcfilters-filter-userExpLevel-experienced-description": "Enemmän kuin 30 päivää aktiivisena ja 500 muokkausta.",
+       "rcfilters-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-sending-request": "API-pyyntöä lähetetään...",
        "apisandbox-loading-results": "API-tuloksia vastaanotetaan...",
        "apisandbox-results-error": "Tapahtui virhe ladattaessa API-kyselyn vastausta: $1",
+       "apisandbox-request-format-url-label": "URL-kyselymerkkijono",
        "apisandbox-request-url-label": "Pyynnön URL",
        "apisandbox-request-time": "Pyyntöön kulunut aika: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Korjaa \"token\" ja lähetä uudelleen",
        "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": "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",
        "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",
        "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-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",
        "authmanager-realname-label": "Oikea nimi",
        "authmanager-realname-help": "Käyttäjän oikea nimi",
        "authmanager-provider-password": "Salasanapohjainen varmennus",
+       "authmanager-provider-password-domain": "Salasana- ja toimialue-pohjainen todennus",
        "authmanager-provider-temporarypassword": "Väliaikainen salasana",
        "authprovider-confirmlink-message": "Viimeisimpien kirjautumisyritystesi perusteella seuraavat tunnukset voidaan linkittää wikitunnuksellesi. Tunnusten linkittäminen mahdollistaa sisäänkirjautumisen niitä käyttämällä. Valitse tunnukset, jotka tulisi linkittää.",
        "authprovider-confirmlink-request-label": "Tunnukset, jotka tulisi yhdistää",
index b10c688..29797b8 100644 (file)
                        "Mabroukb",
                        "Pymouss",
                        "Derugon",
-                       "Benoit Rochon"
+                       "Benoit Rochon",
+                       "Fitoschido",
+                       "Archaeodontosaurus",
+                       "Trizek (WMF)"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "searcharticle": "Lire",
        "history": "Historique de la page",
        "history_short": "Historique",
+       "history_small": "historique",
        "updatedmarker": "modifié depuis ma dernière visite",
        "printableversion": "Version imprimable",
        "permalink": "Adresse permanente",
        "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é.",
        "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.",
        "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 :",
        "editusergroup": "Charger des groupes d’utilisateurs",
        "editinguser": "Modification des droits de l’{{GENDER:$1|utilisateur|utilisatrice}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Affichage des droits utilisateur de {{GENDER:$1|l’utilisateur|l’utilisatrice}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modifier les groupes de l'utilisateur",
-       "userrights-viewusergroup": "Afficher les groupes d'utilisateurs",
+       "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-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.",
+       "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-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.",
        "group": "Groupe :",
        "group-user": "Utilisateurs",
        "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-feedbacklink": "Fournir un commentaire sur les nouveaux filtres (en bêta)",
+       "rcfilters-highlightbutton-title": "Mettre en valeur les résultats",
+       "rcfilters-highlightmenu-title": "Choisir une couleur",
+       "rcfilters-highlightmenu-help": "Sélectionner une couleur pour mettre en évidence cette propriété",
        "rcfilters-filterlist-noresults": "Aucun filtre trouvé",
+       "rcfilters-filtergroup-registration": "Inscription de l’utilisateur",
+       "rcfilters-filter-registered-label": "Connectés",
+       "rcfilters-filter-registered-description": "Éditeurs connectés.",
+       "rcfilters-filter-unregistered-label": "Non connectés",
+       "rcfilters-filter-unregistered-description": "Éditeurs qui ne sont pas connectés.",
        "rcfilters-filtergroup-authorship": "Modifier la paternité",
        "rcfilters-filter-editsbyself-label": "Vos propres modifications",
        "rcfilters-filter-editsbyself-description": "Vos modifications.",
        "rcfilters-filter-editsbyother-label": "Modifications par d’autres.",
        "rcfilters-filter-editsbyother-description": "Modifications créées par d’autres utilisateurs (pas vous).",
+       "rcfilters-filtergroup-userExpLevel": "Niveau d’expérience (uniquement pour les utilisateurs enregistrés)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Nouveaux arrivants",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Moins de 10 modifications et 4 jours d’activité.",
+       "rcfilters-filter-userExpLevel-learner-label": "Apprentis",
+       "rcfilters-filter-userExpLevel-learner-description": "Davantage de jours d’activité et de modifications que les « Nouveaux arrivants » mais moins que les « Utilisateurs expérimentés ».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Utilisateurs expérimentés",
+       "rcfilters-filter-userExpLevel-experienced-description": "Plus de 30 jours d’activité et 500 modifications",
+       "rcfilters-filtergroup-automated": "Contributions automatisées",
+       "rcfilters-filter-bots-label": "Robot",
+       "rcfilters-filter-bots-description": "Modifications faites par des outils automatisés.",
+       "rcfilters-filter-humans-label": "Humain (non robot)",
+       "rcfilters-filter-humans-description": "Modifications faites par des éditeurs humains.",
+       "rcfilters-filtergroup-significance": "Signification",
+       "rcfilters-filter-minor-label": "Modifications mineures",
+       "rcfilters-filter-minor-description": "Modifications que l’auteur a marquées comme mineures.",
+       "rcfilters-filter-major-label": "Modifications non mineures",
+       "rcfilters-filter-major-description": "Modifications non marquées comme mineures.",
+       "rcfilters-filtergroup-changetype": "Type de modification",
+       "rcfilters-filter-pageedits-label": "Modifications de page",
+       "rcfilters-filter-pageedits-description": "Modifications du contenu du wiki, des discussions, des descriptions des catégories…",
+       "rcfilters-filter-newpages-label": "Créations de page",
+       "rcfilters-filter-newpages-description": "Modifications créant de nouvelles pages.",
+       "rcfilters-filter-categorization-label": "Modifications de catégorie",
+       "rcfilters-filter-categorization-description": "Enregistrements de pages ajoutées ou supprimées des catégories.",
+       "rcfilters-filter-logactions-label": "Actions tracées",
+       "rcfilters-filter-logactions-description": "Actions d’administration, créations de compte, suppression de pages, téléchargements…",
        "rcnotefrom": "Ci-dessous {{PLURAL:$5|la modification effectuée|les modifications effectuées}} depuis le <strong>$3, $4</strong> (affichées jusqu’à <strong>$1</strong>).",
        "rclistfrom": "Afficher les nouvelles modifications depuis le $3 à $2",
        "rcshowhideminor": "$1 les modifications mineures",
        "upload_directory_read_only": "Le serveur web n’a pas accès en écriture au répertoire d’import de fichier ($1).",
        "uploaderror": "Erreur lors de l’import",
        "upload-recreate-warning": "<strong>Attention : Un fichier portant ce nom a été supprimé ou déplacé.</strong>\n\nLe journal des suppressions et celui des déplacements de cette page sont affichés ici pour informations :",
-       "uploadtext": "Utilisez ce formulaire pour importer des fichiers sur le serveur.\nPour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des images]]. L’import est aussi enregistré dans le [[Special:Log/upload|journal d’import des fichiers]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].\n\nPour inclure un fichier dans une page, utilisez un lien de la forme :\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.jpg]]</nowiki></code>''', pour afficher le fichier en pleine résolution (dans le cas d’une image) ;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.png|200px|thumb|left|texte descriptif]]</nowiki></code>''' pour utiliser une miniature de 200 pixels de large dans une boîte à gauche avec « texte descriptif » comme description ;\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:fichier.ogg]]</nowiki></code>''' pour lier directement vers le fichier sans l’afficher.",
+       "uploadtext": "Utilisez ce formulaire pour téléverser des fichiers sur le serveur.\nPour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des fichiers téléversés]]. Les envois multiples sont également tracés dans le [[Special:Log/upload|journal des téléversements]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].\n\nPour inclure un fichier dans une page, utilisez un lien ayant l'un des formats suivants :\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.jpg]]</nowiki></code></strong>, pour afficher le fichier en pleine résolution (dans le cas d’une image) ;\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.png|200px|thumb|left|texte descriptif]]</nowiki></code></strong> pour utiliser une miniature de 200 pixels de large dans une boîte à gauche avec « texte descriptif » comme description ;\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:fichier.ogg]]</nowiki></code></strong> pour relier directement le fichier sans l’afficher.",
        "upload-permitted": "{{PLURAL:$2|Format|Formats}} de fichiers {{PLURAL:$2|autorisé|autorisés}} : $1.",
        "upload-preferred": "{{PLURAL:$2|Format|Formats}} de fichiers {{PLURAL:$2|préféré|préférés}} : $1.",
        "upload-prohibited": "‎{{PLURAL:$2|Format|Formats}} de fichiers {{PLURAL:$2|interdit|interdits}} : $1.",
        "uploaded-setting-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-params-json": "Paramètres JSON :",
+       "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\"",
        "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}}.",
        "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}}. {{GENDER:$2|Votre}} courriel sera envoyé directement à l'{{GENDER:$1|émetteur initial}}, en {{GENDER:$1|lui}} mentionnant {{GENDER:$2|votre}} adresse courriel .",
+       "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.",
        "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",
        "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}}.",
        "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 :",
        "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-delete_redir": "$1 a {{GENDER:$2|supprimé}} la redirection 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",
        "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-useragent": "Agent utilisateur :",
        "searchsuggest-search": "Rechercher sur {{SITENAME}}",
        "searchsuggest-containing": "contenant...",
-       "api-error-autoblocked": "Votre adresse IP a été bloquée automatiquement, parce qu’elle a été utilisée par un utilisateur bloqué.",
-       "api-error-badaccess-groups": "Vous n'êtes pas autorisé à téléverser des fichiers sur ce wiki.",
        "api-error-badtoken": "Erreur interne : mauvais « jeton ».",
-       "api-error-blocked": "Vous avez été bloqué en édition.",
-       "api-error-copyuploaddisabled": "Les versements via URL sont désactivés sur ce serveur.",
-       "api-error-duplicate": "Il y a déjà {{PLURAL:$1|un autre fichier présent|d’autres fichiers présents}} sur le site avec le même contenu.",
-       "api-error-duplicate-archive": "Il y avait déjà {{PLURAL:$1|un autre fichier présent|d’autres fichiers présents}} sur le site avec le même contenu, mais {{PLURAL:$1|il a été supprimé|ils ont été supprimés}}.",
-       "api-error-empty-file": "Le fichier que vous avez soumis était vide.",
        "api-error-emptypage": "Création de pages vide n'est pas autorisée.",
-       "api-error-fetchfileerror": "Erreur interne : Quelque chose s'est mal passé lors de la récupération du fichier.",
-       "api-error-fileexists-forbidden": "Un fichier nommé \"$1\" existe déjà, et ne peut pas être écrasé.",
-       "api-error-fileexists-shared-forbidden": "Un fichier nommé \"$1\" existe déjà dans le répertoire des fichiers partagés, et ne peut pas être écrasé.",
-       "api-error-file-too-large": "Le fichier que vous avez soumis était trop grand.",
-       "api-error-filename-tooshort": "Le nom du fichier est trop court.",
-       "api-error-filetype-banned": "Ce type de fichier est interdit.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|n'est pas un type de fichier autorisé|ne sont pas des types de fichiers autorisés}}. {{PLURAL:$3|Le type de fichier autorisé est |Les types de fichiers autorisés sont}} $2.",
-       "api-error-filetype-missing": "L'extension du fichier est manquante.",
-       "api-error-hookaborted": "La modification que vous avez essayé de faire a été annulée par une extension.",
-       "api-error-http": "Erreur interne : ne peut se connecter au serveur.",
-       "api-error-illegal-filename": "Le nom du fichier n'est pas autorisé.",
-       "api-error-internal-error": "Erreur interne : quelque chose s'est mal passé lors du traitement de votre import sur le wiki.",
-       "api-error-invalid-file-key": "Erreur interne : fichier non trouvé dans l'espace de stockage temporaire.",
-       "api-error-missingparam": "Erreur interne : Il manque des paramètres dans la requête.",
-       "api-error-missingresult": "Erreur interne : Nous n'avons pas pu déterminer si la copie avait réussi.",
-       "api-error-mustbeloggedin": "Vous devez être connecté pour télécharger des fichiers.",
-       "api-error-mustbeposted": "Erreur interne : cette requête nécessite la méthode HTTP POST.",
-       "api-error-noimageinfo": "Le téléchargement a réussi, mais le serveur n’a pas fourni d’information 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-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}}",
        "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.",
        "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'')",
        "usercssispublic": "Veuillez noter: les sous-pages CSS ne doivent pas contenir de données confidentielles parce qu'elles sont visibles des autres utilisateurs.",
        "restrictionsfield-badip": "Adresse IP ou plage non valide : $1",
        "restrictionsfield-label": "Plages IP autorisées :",
-       "restrictionsfield-help": "Une adresse IP ou une plage CIDR par ligne. Pour tout activer, utiliser <br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "Une adresse IP ou une plage CIDR par ligne. Pour tout activer, utiliser <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "version $1",
        "pageid": "ID de page $1"
 }
index 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 063cdae..a022551 100644 (file)
        "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",
        "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.",
        "feedback-useragent": "Brüker-agent:",
        "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 f5da074..ee93166 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",
        "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]].",
        "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",
        "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",
        "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:",
        "editusergroup": "Cargar os grupos de usuario",
        "editinguser": "Mudando os dereitos {{GENDER:$1|do usuario|da usuaria}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Consultando os dereitos {{GENDER:$1|de usuario|de usuaria}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Editar os grupos do usuario",
-       "userrights-viewusergroup": "Consultar os grupos do usuario",
+       "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-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.",
        "group": "Grupo:",
        "group-user": "Usuarios",
        "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-feedbacklink": "Deixar comentarios sobre os novos filtros (en fase beta)",
+       "rcfilters-highlightbutton-title": "Resaltar resultados",
+       "rcfilters-highlightmenu-title": "Seleccione unha cor",
+       "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",
        "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\".",
        "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}}. {{GENDER:$2|A súa}} dirección de correo electrónico será enviada directamente {{GENDER:$1|ó|á}} remitente orixinal, {{GENDER:$1|revelándolle}} a {{GENDER:$2|súa}} dirección de correo.",
+       "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",
        "editcomment": "O resumo de edición foi: <em>$1</em>.",
        "revertpage": "Desfixéronse as edicións de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]]); cambiado á última versión feita por [[User:$1|$1]]",
        "revertpage-nouser": "Desfixéronse as edicións dun usuario agochado; cambiado á última versión feita por {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Desfixéronse as edicións de $1;\nvolveuse á última edición, feita por $2.",
+       "rollback-success": "Desfixéronse as edicións de {{GENDER:$3|$1}};\nvolveuse á última edición, feita por {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertéronse as edicións de $1;\nrestaurouse a última revisión de $2. [$3 Mostrar os cambios]",
        "sessionfailure-title": "Erro de sesión",
        "sessionfailure": "Parece que hai un problema co rexistro da súa sesión;\nesta acción cancelouse como precaución fronte ao secuestro de sesións.\nPrema no botón \"atrás\", volva cargar a páxina da que proviña e inténteo de novo.",
        "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",
        "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-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-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",
        "usercssispublic": "Lembre: As subpáxinas CSS non deberían conter datos confidenciais porque outros usuarios poden velos.",
        "restrictionsfield-badip": "Enderezo IP ou rango de IP non válido: $1",
        "restrictionsfield-label": "Rangos de IP permitidos:",
-       "restrictionsfield-help": "Un único enderezo IP ou rango CIDR por liña. Para habilitalos todos, utilice<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "Un único enderezo IP ou rango CIDR por liña. Para habilitalos todos, utiliceː\n<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisión $1",
        "pageid": "identificador de páxina $1"
 }
index 4e4e804..bb6c4bc 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>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}( [[Special:NewPages|تازه ولگؤنˇ ليسته]] بينين)",
+       "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 c6f36fa..93c5007 100644 (file)
        "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",
        "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.",
        "specialpages-group-changes": "D letschte Änderige un Logbüecher",
        "specialpages-group-media": "Medie",
        "specialpages-group-users": "Benutzer un Rächt",
-       "specialpages-group-highuse": "Syte wo oft bruucht werde",
+       "specialpages-group-highuse": "Syte wo hüüfig bruucht werde",
        "specialpages-group-pages": "Lischte vo Syte",
        "specialpages-group-pagetools": "Sytewerchzüüg",
        "specialpages-group-wiki": "Date un Wärchzyyg",
        "feedback-useragent": "User Agent:",
        "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 ea79864..6a63089 100644 (file)
        "searcharticle": "לדף",
        "history": "היסטוריית הגרסאות של הדף",
        "history_short": "היסטוריה",
+       "history_small": "היסטוריה",
        "updatedmarker": "עודכן מאז ביקורך האחרון",
        "printableversion": "גרסה להדפסה",
        "permalink": "קישור קבוע",
        "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": "המשתמש חסום",
        "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": "שפת הממשק:",
        "editusergroup": "טעינת קבוצות המשתמש",
        "editinguser": "שינוי ההרשאות של {{GENDER:$1|המשתמש|המשתמשת}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "צפייה בהרשאות של {{GENDER:$1|המשתמש|המשתמשת}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "עריכת קבוצות משתמש",
-       "userrights-viewusergroup": "צפייה בקבוצות משתמש",
+       "userrights-editusergroup": "עריכת קבוצות {{GENDER:$1|המשתמש|המשתמשת}}",
+       "userrights-viewusergroup": "צפייה בקבוצות {{GENDER:$1|המשתמש|המשתמשת}}",
        "saveusergroups": "שמירת הקבוצות של ה{{GENDER:$1|משתמש|משתמשת}}",
        "userrights-groupsmember": "{{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-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": "התנגשות בין שינויי הרשאות משתמש! אנא בִּדקו את השינויים שלכם ואשרו אותם.",
        "group": "קבוצה:",
        "group-user": "משתמשים",
        "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-feedbacklink": "שליחת משוב על המסננים החדשים (בטא)",
+       "rcfilters-highlightbutton-title": "הבלטת התוצאות",
+       "rcfilters-highlightmenu-title": "בחירת צבע",
+       "rcfilters-highlightmenu-help": "בחירת צבע להדגשת מאפיין זה",
        "rcfilters-filterlist-noresults": "לא נמצאו מסננים",
-       "rcfilters-filtergroup-authorship": "מחבר העריכה",
+       "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": "ער×\99×\9b×\95ת ×©×¢×©×\99ת.",
+       "rcfilters-filter-editsbyself-description": "ער×\99×\9b×\95ת ×©×\91×\99צעת ×\91עצ×\9e×\9a.",
        "rcfilters-filter-editsbyother-label": "עריכות של אחרים",
-       "rcfilters-filter-editsbyother-description": "עריכות שנוצרו על־ידי אנשים אחרים (לא על־ידיך.)",
+       "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 עריכות משניות",
        "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-params-json": "הפרמטרים בפורמט JSON:",
+       "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\" נכשלה.",
        "emailccsubject": "העתק של הודעתך למשתמש $1: $2",
        "emailsent": "הדואר נשלח",
        "emailsenttext": "הודעת הדואר האלקטרוני שלך נשלחה.",
-       "emailuserfooter": "$1 {{GENDER:$1|שלח|שלחה}} את הדוא\"ל הזה ל{{GENDER:$2|משתמש|משתמשת}} $2 באמצעות התכונה \"{{int:emailuser}}\" באתר {{SITENAME}}. התשובה שלך תישלח ישירות {{GENDER:$1|לשולח המקורי|לשולחת המקורית}}, והיא תחשוף {{GENDER:$1|בפניו|בפניה}} את כתובת הדוא\"ל שלך.",
+       "emailuserfooter": "$1 {{GENDER:$1|ש×\9c×\97|ש×\9c×\97×\94}} ×\90ת ×\94×\93×\95×\90\"×\9c ×\94×\96×\94 ×\9c{{GENDER:$2|×\9eשת×\9eש|×\9eשת×\9eשת}} $2 ×\91×\90×\9eצע×\95ת ×\94ת×\9b×\95× ×\94 \"{{int:emailuser}}\" ×\91×\90תר {{SITENAME}}. ×\90×\9d {{GENDER:$2|ת×\92×\99×\91|ת×\92×\99×\91×\99}} ×\9c×\93×\95×\90\"×\9c ×\94×\96×\94, ×\94תש×\95×\91×\94 ×©×\9c×\9a ×ª×\99ש×\9c×\97 ×\99ש×\99ר×\95ת {{GENDER:$1|×\9cש×\95×\9c×\97 ×\94×\9eק×\95ר×\99\9cש×\95×\9c×\97ת ×\94×\9eק×\95ר×\99ת}}, ×\95×\94×\99×\90 ×ª×\97ש×\95×£ {{GENDER:$1|×\91פנ×\99×\95\91פנ×\99×\94}} ×\90ת ×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×©×\9c×\9a.",
        "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": "שוחזר מעריכות של {{GENDER:$3|$1}} לעריכה האחרונה של {{GENDER:$4|$2}}.",
        "rollback-success-notify": "שוחזר מעריכות של $1 לעריכה האחרונה של $2. [$3 הצגת שינויים]",
        "sessionfailure-title": "בעיה בחיבור",
        "sessionfailure": "נראה שיש בעיה בחיבור שלך לאתר;\nפעולה זו בוטלה כאמצעי זהירות נגד התחזות לתקשורת ממחשבך.\nנא לחזור לדף הקודם, לטעון אותו מחדש ולנסות שוב.",
        "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": "אינכם יכולים לחסום או לשחרר את חסימתם של משתמשים אחרים, כיוון שאתם עצמכם חסומים.",
        "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-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": "×\9eס×\93 הנתונים לא הצליח לשנות את שפת הדף.",
+       "pagelang-unchanged-language-default": "×\94×\93×£ $1 ×\9b×\91ר ×\9e×\95×\92×\93ר ×\9cשפת ×\94ת×\95×\9b×\9f ×\94×\94ת×\97×\9cת×\99ת ×©×\9c ×\90תר ×\94×\95×\95×\99ק×\99.",
+       "pagelang-db-failed": "×\91ס×\99ס הנתונים לא הצליח לשנות את שפת הדף.",
        "right-pagelang": "שינוי שפות של דפים",
        "action-pagelang": "לשנות את שפת הדף",
        "log-name-pagelang": "יומן שינוי שפה",
        "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-upload-upload": "העלאות של קבצים חדשים",
        "log-action-filter-upload-overwrite": "דריסות של קבצים קיימים",
        "authmanager-authn-not-in-progress": "האימות נכשל או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
-       "authmanager-authn-no-primary": "×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9c×\90×\9eת ×\90ת ×\94×\90×\99ש×\95ר×\99×\9d שסופקו.",
-       "authmanager-authn-no-local-user": "×\94×\90×\99ש×\95ר×\99×\9d שסופקו אינם שייכים לשום משתמש באתר זה.",
+       "authmanager-authn-no-primary": "×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9c×\90×\9eת ×\90ת × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שסופקו.",
+       "authmanager-authn-no-local-user": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שסופקו אינם שייכים לשום משתמש באתר זה.",
        "authmanager-authn-no-local-user-link": "נתוני ההאמנה שניתנו תקינים, אבל אינם משויכים לשום משתמש בוויקי הזה. נא להיכנס לחשבון באופן שונה, או ליצור משתמש חדש ואז תהיה לך אפשרות לקשר את נתוני ההאמנה הקודמים שלך לחשבון ההוא.",
        "authmanager-authn-autocreate-failed": "יצירה אוטומטית של חשבון מקומי נכשלה: $1",
        "authmanager-change-not-supported": "לא ניתן לשנות את נתוני ההאמנה שניתנו, כי שום דבר לא ישתמש בהם.",
        "authmanager-create-disabled": "אפשרות יצירת החשבונות מבוטלת.",
        "authmanager-create-from-login": "כדי ליצור את החשבון, יש למלא את השדות.",
        "authmanager-create-not-in-progress": "יצירת החשבון נכשלה או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
-       "authmanager-create-no-primary": "×\94×\90×\99ש×\95ר×\99×\9d שסופקו לא יכולים להיות בשימוש ביצירת חשבון.",
-       "authmanager-link-no-primary": "×\94×\90×\99ש×\95ר×\99×\9d ×©×¡×\95פק×\95 ×\9c×\90 ×\99×\9b×\95×\9c×\99×\9d ×\9c×\94×\99×\95ת ×\91ש×\99×\9e×\95ש ×\91קישור חשבונות.",
+       "authmanager-create-no-primary": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שסופקו לא יכולים להיות בשימוש ביצירת חשבון.",
+       "authmanager-link-no-primary": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת ×©×¡×\95פק×\95 ×\9c×\90 ×\99×\9b×\95×\9c×\99×\9d ×\9c×\94×\99×\95ת ×\91ש×\99×\9e×\95ש ×\9cש×\9d קישור חשבונות.",
        "authmanager-link-not-in-progress": "קישור החשבונות נכשל או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
        "authmanager-authplugin-setpass-failed-title": "שינוי הסיסמה נכשל",
        "authmanager-authplugin-setpass-failed-message": "תוסף האימות דחה את שינוי הסיסמה.",
        "authpage-cannot-link-continue": "לא ניתן להמשיך בתהליך קישור החשבונות. כנראה שזמן ההמתנה של הפעולה חלף.",
        "cannotauth-not-allowed-title": "הגישה נדחתה",
        "cannotauth-not-allowed": "אינך מורשה להשתמש בדף זה",
-       "changecredentials": "ש×\99× ×\95×\99 ×\94×\90×\99ש×\95ר×\99×\9d",
-       "changecredentials-submit": "ש×\99× ×\95×\99 ×\94×\90×\99ש×\95ר×\99×\9d",
+       "changecredentials": "ש×\99× ×\95×\99 × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת",
+       "changecredentials-submit": "ש×\99× ×\95×\99 × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת",
        "changecredentials-invalidsubpage": "$1 אינו סוג אישור תקין.",
-       "changecredentials-success": "×\94×\90×\99ש×\95ר×\99×\9d שלך שונו.",
-       "removecredentials": "×\94סרת ×\94×\90×\99ש×\95ר×\99×\9d",
-       "removecredentials-submit": "×\94סרת ×\94×\90×\99ש×\95ר×\99×\9d",
+       "changecredentials-success": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שלך שונו.",
+       "removecredentials": "×\94סרת × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת",
+       "removecredentials-submit": "×\94סרת × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת",
        "removecredentials-invalidsubpage": "$1 אינו סוג אישור תקין.",
-       "removecredentials-success": "×\94×\90×\99ש×\95ר×\99×\9d שלך הוסרו.",
-       "credentialsform-provider": "ס×\95×\92 ×\94×\90×\99ש×\95ר×\99×\9d:",
+       "removecredentials-success": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שלך הוסרו.",
+       "credentialsform-provider": "ס×\95×\92 × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת:",
        "credentialsform-account": "שם החשבון:",
        "cannotlink-no-provider-title": "אין חשבונות שניתן לקשר",
        "cannotlink-no-provider": "אין חשבונות שניתן לקשר.",
        "usercssispublic": "שימו לב: משתמשים אחרים יכולים לצפות בדפי ה־CSS שלכם, ולכן אין לכלול בהם מידע סודי.",
        "restrictionsfield-badip": "כתובת או טווח כתובות IP בלתי תקין: $1",
        "restrictionsfield-label": "טווחי כתובות IP מותרים:",
-       "restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "גרסה $1",
        "pageid": "מזהה דף $1"
 }
index 456ba8d..33cf429 100644 (file)
                        "Nemo bis",
                        "Wassan.anmol",
                        "Ziyaurr",
-                       "NehalDaveND"
+                       "NehalDaveND",
+                       "Susant purohit",
+                       "Jayprakash12345",
+                       "Dr. Shikha Jaggi",
+                       "Shyamal"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "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 मई",
        "searcharticle": "जाएँ",
        "history": "पृष्ठ इतिहास",
        "history_short": "इतिहास",
+       "history_small": "इतिहास",
        "updatedmarker": "मेरे अन्तिम बार पधारने के बाद के अद्यतन",
        "printableversion": "छापने योग्य संस्करण",
        "permalink": "स्थायी कड़ी",
        "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": "इस पृष्ठ का सीधे प्रयोग करने के लिए आपको लॉग इन करना होगा।",
        "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>.",
        "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": "उदाहरण",
        "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-nodatabase": "डाटाबेस $1 या तो मौजूद नहीं है या फिर स्थानीय नहीं है।",
        "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": "सदस्य अधिकार बदलावों में अंतर्विरोध! कृपया अपने बदलाव जाँचें और पुनः सुनिश्चित करें।",
        "group": "समूह:",
        "group-user": "सदस्य",
        "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-basic": "सामान्य अधिकार",
        "grant-viewdeleted": "हटाये गए फ़ाइल व पृष्ठ देखें",
        "grant-viewmywatchlist": "अपनी ध्यानसूची देखें",
+       "grant-viewrestrictedlogs": "प्रतिबंधित प्रविष्टि लॉग देखें",
        "newuserlogpage": "सदस्य खाता निर्माण लॉग",
        "newuserlogpagetext": "यह सदस्य खातों के निर्माण का लॉग है।",
        "rightslog": "सदस्य अधिकार लॉग",
        "action-writeapi": "लेखन ए॰पी॰आई का प्रयोग करने",
        "action-delete": "इस पृष्ठ को हटाने",
        "action-deleterevision": "इस अवतरण को हटाने",
+       "action-deletelogentry": "लॉग प्रविष्टियाँ को हटाए",
        "action-deletedhistory": "इस पृष्ठ के मिटे इतिहास को देखने",
        "action-browsearchive": "हटाएँ गए पृष्ठों में खोजने",
        "action-undelete": "इस पृष्ठ को पुनर्स्थापित करने",
        "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|अंतिम बार देखने के बाद से}}",
        "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-highlightbutton-title": "परिणाम रेखांकन करें",
+       "rcfilters-highlightmenu-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-userExpLevel-newcomer-label": "अपरिचित",
+       "rcfilters-filter-userExpLevel-learner-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जावा फ़ाइलों को अपलोड करना वर्जित है, क्योंकि इनके कारण सुरक्षा बाधाएँ पार की जा सकती हैं।",
        "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": "$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": "चिप्पी का नाम",
        "feedback-useragent": "सदस्य कर्ता:",
        "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|घंटा|घंटे}}",
        "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 fb78acc..12ea679 100644 (file)
        "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",
        "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-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.",
        "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",
        "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.",
        "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.",
        "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.",
        "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-nodatabase": "Database $1 abhi hai nai, nai to local nai hai.",
        "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.",
        "group": "Jhund:",
        "group-user": "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-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",
        "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-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.",
        "tooltip-pt-preferences": "{{GENDER:|Aap ke}} pasand",
        "tooltip-pt-watchlist": "Panna ke suchi jispe aap dhyan rakhaa hae",
        "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-feed-rss": "Ii panna ke khatir RSS feed",
        "tooltip-feed-atom": "Ii panna ke khatir atom feed",
        "tooltip-t-contributions": "Yogdaan ke suchi dekho {{GENDER:$1|ii sadasya se}}",
-       "tooltip-t-emailuser": "Ii user ke lage ek mail bhejo",
+       "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.",
        "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.",
+       "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 1e48a43..bd4f303 100644 (file)
@@ -34,7 +34,8 @@
                        "Teoo3",
                        "Matma Rex",
                        "Vrhnje",
-                       "Ivi104"
+                       "Ivi104",
+                       "Сербијана"
                ]
        },
        "tog-underline": "Podcrtavanje poveznica",
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategorija|Kategorije|Kategorija}}",
-       "category_header": "Stranice u kategoriji \"$1\"",
+       "category_header": "Stranice u kategoriji »$1«",
        "subcategories": "Potkategorije",
-       "category-media-header": "Mediji u kategoriji \"$1\":",
+       "category-media-header": "Mediji u kategoriji »$1«",
        "category-empty": "''U ovoj kategoriji trenutačno nema članaka ni medija.''",
        "hidden-categories": "{{PLURAL:$1|Skrivena kategorija|Skrivene kategorije|Skrivenih kategorija}}",
        "hidden-category-category": "Skrivene kategorije",
        "searchbutton": "Traži",
        "go": "Kreni",
        "searcharticle": "Kreni",
-       "history": "Stare izmjene",
+       "history": "Povijest stranice",
        "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-emailuser": "Pošalji e-poštu {{GENDER:$1|suradniku|suradnici}}",
+       "tool-link-userrights-readonly": "Vidi {{GENDER:$1|suradnikovu|suradničinu|suradničku}} pripadnost skupinama",
+       "tool-link-emailuser": "Pošalji {{GENDER:$1|suradniku|suradnici}} e-poruku",
        "userpage": "Vidi suradnikovu stranicu",
        "projectpage": "Vidi stranicu o projektu",
        "imagepage": "Vidi stranicu datoteke",
        "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",
        "youhavenewmessages": "Imate $1 ($2).",
        "youhavenewmessagesfromusers": "Imate $1 {{PLURAL:$3||od $3 suradnika|od $3 suradnika}} ($2).",
        "youhavenewmessagesmanyusers": "Imate $1 od više suradnika ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|novu poruku|$1 nove poruke|999=novih poruka}}",
+       "newmessageslinkplural": "{{PLURAL:$1|novu poruku|999=nove poruke}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|posljednje uređivanje|posljednja $1 uređivanja|posljednjih $1 uređivanja}} na stranici za razgovor",
        "youhavenewmessagesmulti": "Imate nove poruke na $1",
        "editsection": "uredi",
        "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-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-header": "Ispunite ovaj obrazac da biste promijenili svoju adresu e-pošte. Ukoliko želite ukloniti povezanost svoje adrese e-pošte i suradničkoga računa, prilikom popunjavanja obrasca ostavite prazno polje umjesto upisivanja nove adrese e-pošte.",
        "changeemail-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.",
+       "changeemail-nochange": "Molimo vas, upišite neku novu adresu e-pošte.",
        "bold_sample": "Podebljani tekst",
        "bold_tip": "Podebljani tekst",
        "italic_sample": "Kurzivni tekst",
        "minoredit": "Ovo je manja promjena",
        "watchthis": "Prati ovu stranicu",
        "savearticle": "Sačuvaj stranicu",
-       "savechanges": "Spremi promjene",
+       "savechanges": "Sačuvaj stranicu",
        "publishpage": "Objavi stranicu",
        "publishchanges": "Objavi izmjene",
        "preview": "Pregled kako će stranica izgledati",
        "missingsummary": "'''Podsjetnik:''' Niste unijeli sažetak promjena. Ako ponovno kliknete na \"Sačuvaj stranicu\", Vaše će promjene biti snimljene bez sažetka.",
        "selfredirect": "<strong>Upozorenje:</strong> Stvarate preusmjeravanje na isti članak.\nMožda ste izabrali pogrješnu odredišnu stranicu za preusmjeravanje ili uređujete pogrješnu stranicu.\nAko pritisnete na \"{{int:savearticle}}\" još jednom, preusmjeravanje će svejedno biti stvoreno.",
        "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:",
+       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali sažetak ovoga komentara. Ukoliko ponovo kliknete \"{{int:savearticle}}\", Vaš će komentar biti snimljen bez sažetka.",
+       "summary-preview": "Pregled polja Sažetak:",
+       "subject-preview": "Pregled teme:",
+       "previewerrortext": "Pri pokušaju prikazivanja pretpregleda vaših promjena došlo je do pogrješke.",
        "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.",
        "yourdiff": "Razlike",
        "copyrightwarning": "Molimo uočite da se svi doprinosi {{SITENAME}} smatraju objavljenima pod uvjetima $2 (vidi $1 za detalje). Ako ne želite da se Vaše pisanje nemilosrdno uređuje i slobodno raspačava, nemojte ga ovamo slati.<br />\nTakođer nam obećavate da ste ovo sami napisali, ili da ste to prepisali iz nečeg što je u javnom vlasništvu ili pod sličnom slobodnom licencijom.\n'''NE POSTAVLJAJTE RADOVE ZAŠTIĆENE AUTORSKIM PRAVIMA BEZ DOPUŠTENJA!'''",
        "copyrightwarning2": "Molimo uočite da svi suradnici mogu mijenjati sve doprinose na {{SITENAME}}. Ako ne želite da se Vaše pisanje nemilosrdno uređuje, nemojte ga slati ovdje.<br /> Također nam obećavate da ste ovo sami napisali, ili da ste to prepisali iz nečeg što je u javnom vlasništvu ili pod sličnom slobodnom licencijom (vidi $1 za detalje). '''NE POSTAVLJAJTE RADOVE ZAŠTIĆENE AUTORSKIM PRAVIMA BEZ DOPUŠTENJA!'''",
+       "editpage-cannot-use-custom-model": "Model sadržaja ove stranice ne može se mijenjati.",
        "longpageerror": "'''Pogrješka: Tekst koji ste unijeli dug je {{PLURAL:$1|jedan kilobajt|$1 kilobajta}}, što je više od maksimalno {{PLURAL:$2|jednog kilobajta|$2 kilobajta}}.'''\nNije ga moguće snimiti.",
        "readonlywarning": "'''UPOZORENJE: Baza podataka je zaključana zbog održavanja, pa trenutačno ne možete sačuvati svoje\npromjene. Najbolje je da kopirate i zaljepite tekst u tekstualnu datoteku te je snimite za kasnije.'''\n\nAdministrator je zaključao bazu iz razloga: $1",
        "protectedpagewarning": "'''UPOZORENJE: Ova stranica je zaključana i mogu je uređivati samo suradnici s administratorskim pravima.'''\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
        "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:",
        "content-json-empty-object": "Prazan objekt",
        "content-json-empty-array": "Prazno polje",
        "duplicate-args-warning": "<strong>Upozorenje:</strong> [[:$1]] poziva na [[:$2]] s više od jedne vrijednosti za parametar \"$3\". Rabit će se samo posljednja navedena vrijednost.",
+       "duplicate-args-category": "Stranice u kojima se ponavljaju argumenti u predlošcima",
        "expensive-parserfunction-warning": "Upozorenje: Ova stranica sadrži previše opterećujućih poziva parserskih funkcija\n\nTrebala bi imati manje od $2 {{PLURAL:$2|poziva|poziva}}, sada ima {{PLURAL:$1|$1 poziv|$1 poziva}}.",
        "expensive-parserfunction-category": "Stranice s previše poziva opterećujućih parserskih funkcija",
        "post-expand-template-inclusion-warning": "Upozorenje: Veličina uključenih predložaka je prevelika.\nNeki predlošci neće biti uključeni.",
        "last": "pret",
        "page_first": "prva",
        "page_last": "zadnja",
-       "histlegend": "Uputa: (sad) = razlika od trenutačne inačice,\n(pret) = razlika od prethodne inačice, m = manja promjena",
+       "histlegend": "Izbor za usporedbu: označi kružiće pokraj dvije inačice koje želiš usporediti i pritisni \"Enter\" ili tipku na dnu.<br />\nUputa: <strong>({{int:cur}})</strong> = razlika od trenutačne inačice, <strong>({{int:last}})</strong> = razlika od prethodne inačice, <strong>{{int:minoreditletter}}</strong> = manja promjena.",
        "history-fieldset-title": "Pretraži povijest",
        "history-show-deleted": "Samo izbrisane",
        "histfirst": "najstarije",
        "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.",
        "mergehistory-empty": "Nema spojivih promjena (spajanje nije moguće).",
        "mergehistory-done": "$3 {{PLURAL:$3|izmjena|izmjene}} stranice $1 uspješno {{PLURAL:$3|spojena|spojene}} u povijest stranice [[:$2]].",
        "mergehistory-fail": "Nemoguće spojiti povijest stranica, molimo provjerite stranice i vremenske parametre.",
+       "mergehistory-fail-bad-timestamp": "Oznaka vremena nije valjana.",
        "mergehistory-no-source": "Izvorna stranica $1 ne postoji.",
        "mergehistory-no-destination": "Ciljna stranica $1 ne postoji.",
        "mergehistory-invalid-source": "Izvorna stranica mora imati valjani naziv.",
        "mergelog": "Evidencija spajanja povijesti stranica",
        "revertmerge": "Razdvoji",
        "mergelogpagetext": "Slijedi popis posljednjih spajanja povijesti stranica.",
-       "history-title": "Povijest izmjena stranice \"$1\"",
-       "difference-title": "Razlika između inačica stranice $1",
+       "history-title": "Povijest izmjena stranice »$1«",
+       "difference-title": "Razlika između inačica stranice »$1«",
        "difference-title-multipage": "Razlika između stranica \"$1\" i \"$2\"",
        "difference-multipage": "(Razlika između stranica)",
        "lineno": "Redak $1:",
        "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-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.",
        "userrights-user-editname": "Unesite suradničko ime:",
        "editusergroup": "Učitaj suradničke skupine",
        "editinguser": "Promjena suradničkih prava {{GENDER:$1|suradnika|suradnice}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Uredi suradničke skupine",
-       "userrights-viewusergroup": "Pregled suradničkih skupina",
+       "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-groupsmember": "{{GENDER:$2|Pripadnik|Pripadnica}} skupina:",
+       "userrights-groupsmember-auto": "{{GENDER:$2|Pripadnik|Pripadnica}} obuhvaćenih skupina:",
+       "userrights-groups-help": "Možete promijeniti skupine za ovog suradnika:\n* označena kućica pokazuje skupinu kojoj suradnik pripada;\n* neoznačena kućica pokazuje skupinu kojoj suradnik ne pripada;\n* zvjezdica (*) označava skupinu koju ne možete ukloniti kad ju jednom dodate, ili obratno.\n* povisilica (#) označava da rok valjanosti pripadanja skupini možete samo skratiti, a ne i produljiti",
        "userrights-reason": "Razlog:",
        "userrights-no-interwiki": "Nemate dopuštenje za uređivanje suradničkih prava na drugim wikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalno dostupna.",
        "userrights-changeable-col": "Skupine koje možete promijeniti",
        "userrights-unchangeable-col": "Skupine koje ne možete promijeniti",
+       "userrights-expiry-none": "Neograničeno trajanje statusa",
        "userrights-conflict": "Sukob promjene suradničkih prava! Molimo provjerite i potvrdite svoje promjene.",
        "group": "Skupina:",
        "group-user": "Suradnici",
-       "group-autoconfirmed": "automatski potvrđeni suradnici",
+       "group-autoconfirmed": "Automatski potvrđeni suradnici",
        "group-bot": "Botovi",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birokrati",
        "right-move": "Premještanje stranica",
        "right-move-subpages": "Premještanje stranica s njihovim podstranicama",
        "right-move-rootuserpages": "Premještanje osnovne stranice suradnika",
+       "right-move-categorypages": "premještanja kategorizacijskih stranica",
        "right-movefile": "Premještanje datoteka",
        "right-suppressredirect": "Ne raditi preusmjeravanje od starog imena prilikom premještanja stranice",
        "right-upload": "Postavljanje datoteka",
        "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",
        "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-minor": "Manja izmjena",
        "recentchanges-label-bot": "Izmjenu napravio bot",
        "recentchanges-label-unpatrolled": "Nepregledana izmjena",
-       "recentchanges-label-plusminus": "Promjena veličine stranice (u bajtovima)",
+       "recentchanges-label-plusminus": "Promjena veličine stranice u bajtovima",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "Nova stranica",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "filehist-dimensions": "Dimenzije",
        "filehist-filesize": "Veličina datoteke",
        "filehist-comment": "Komentar",
-       "imagelinks": "Upotreba datoteke",
+       "imagelinks": "Uporaba datoteke",
        "linkstoimage": "{{PLURAL:$1|Sljedeća stranica povezuje|$1 sljedeće stranice povezuju|$1 sljedećih stranica povezuje}} na ovu datoteku:",
        "linkstoimage-more": "Više od $1 {{PLURAL:$1|stranice povezuje|stranica povezuje}} na ovu datoteku.\nSljedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vode na ovu datoteku.\n[[Special:WhatLinksHere/$2|Ovdje se nalazi]] potpuni popis.",
        "nolinkstoimage": "Nijedna stranica ne povezuje na ovu sliku.",
        "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:",
        "showhideselectedlogentries": "Otkrij/sakrij odabrane evidencije",
        "checkbox-select": "Odaberite: $1",
        "checkbox-all": "Sve",
-       "checkbox-none": "Nijedan",
+       "checkbox-none": "Ništa",
        "checkbox-invert": "Obrnuto",
        "allpages": "Sve stranice",
        "nextpage": "Sljedeća stranica ($1)",
        "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",
        "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",
        "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",
        "lastmodifiedatby": "Ovu je stranicu posljednji put {{GENDER:$4|mijenjao suradnik|mijenjala suradnica}} $3 dana $1 u $2.",
        "othercontribs": "Temelji se na doprinosu suradnika $1.",
        "others": "drugih",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|suradnik|suradnici}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|suradnik|suradnica}}|suradnici}} $1",
        "anonusers": "{{SITENAME}} {{PLURAL:$2|anonimni suradnik|anonimni suradnici}} $1",
        "creditspage": "Autori stranice",
        "nocredits": "Za ovu stranicu nema podataka o autorima.",
        "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",
        "bad_image_list": "Rabi se sljedeći format:\n\nSamo retci koji počinju sa zvjezdicom su prikazani. Prva poveznica u retku mora biti poveznica na nevaljanu sliku.\nSvaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se slike pojavljuju ''inline''.",
        "variantname-sr-ec": "ćirilica",
        "variantname-sr-el": "latinica",
-       "metadata": "Metapodaci",
+       "metadata": "Metapodatci",
        "metadata-help": "Ova datoteka sadržava dodatne podatke koje je vjerojatno dodala digitalna kamera ili skener u procesu snimanja odnosno digitalizacije. Ako je datoteka mijenjana, podatci možda nisu u skladu sa stvarnim stanjem.",
        "metadata-expand": "Pokaži sve podatke",
        "metadata-collapse": "Sakrij dodatne podatke",
        "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",
        "tags": "Valjane oznake izmjena",
        "tag-filter": "Filtar [[Special:Tags|oznaka]]:",
        "tag-filter-submit": "Filtar",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake|Oznaka}}]]: $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-delete_redir": "$1 je premještanjem {{GENDER:$2|pobrisao|pobrisala}} preusmjeravanje $3",
        "logentry-delete-restore": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3",
        "logentry-delete-event": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|zapisa u evidenciji|$5 zapisa u evidenciji}} na $3: $4",
        "logentry-delete-revision": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|uređivanja|$5 uređivanja}} na stranici $3: $4",
        "logentry-move-move-noredirect": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 bez preusmjeravanja",
        "logentry-move-move_redir": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 preko preusmjeravanja",
        "logentry-move-move_redir-noredirect": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja",
-       "logentry-patrol-patrol": "$1 je {{GENDER:$2|označio|označila}} uređivanje $4 stranice $3 pregledanim",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|označio|označila}} je uređivanje $4 stranice $3 ophođenim",
        "logentry-patrol-patrol-auto": "$1 je automatski {{GENDER:$2|označio|označila}} uređivanje $4 stranice $3 pregledanim",
        "logentry-newusers-newusers": "$1 je {{GENDER:$2|otvorio|otvorila}} suradnički račun",
        "logentry-newusers-create": "$1 je {{GENDER:$2|stvorio|stvorila}} suradnički račun.",
        "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-thanks-title": "Hvala!",
        "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 67500f2..1bceb36 100644 (file)
        "searcharticle": "Անցնել",
        "history": "Էջի պատմություն",
        "history_short": "Պատմություն",
-       "updatedmarker": "թարմացվել է իմ վերջին այցից հետո",
+       "updatedmarker": "փոփոխվել է ձեր վերջին այցից հետո",
        "printableversion": "Տպելու տարբերակ",
        "permalink": "Մշտական հղում",
        "print": "Տպել",
        "retypenew": "Հաստատեք նոր գաղտնաբառը.",
        "resetpass_submit": "Հաստատել գաղտնաբառը և մտնել համակարգ",
        "changepassword-success": "Ձեր գաղտնաբառը փոփոխվեց։",
-       "botpasswords": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö\80եր",
-       "botpasswords-disabled": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö\80Õ¥Ö\80Õ¶ անջատված են:",
-       "botpasswords-existing": "Ô³Õ¸ÕµÕ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶ Õ¸Ö\82Õ¶Õ¥Ö\81Õ¸Õ² Õ¢Õ¸Õ¿Õ¡ÕµÕ«Õ¶ Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö\80Õ¥Ö\80Õ¨",
-       "botpasswords-createnew": "Õ\8dÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¸Ö\80 Õ¢Õ¸Õ¿Õ¡ÕµÕ«Õ¶ Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80",
-       "botpasswords-editexisting": "Խմբագրել առկա բոտային ծածկագիրը",
+       "botpasswords": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼եր",
+       "botpasswords-disabled": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö\80Õ¨ անջատված են:",
+       "botpasswords-existing": "Ô³Õ¸ÕµÕ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶ Õ¸Ö\82Õ¶Õ¥Ö\81Õ¸Õ² Õ¢Õ¸Õ¿Õ¥Ö\80Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö\80",
+       "botpasswords-createnew": "Õ\8dÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¸Ö\80 Õ¢Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼",
+       "botpasswords-editexisting": "Փոխել եղած բոտի գաղտնաբառը",
        "botpasswords-label-appid": "Բոտի անուն՝",
        "botpasswords-label-create": "Ստեղծել",
        "botpasswords-label-update": "Թարմացնել",
        "botpasswords-label-cancel": "Չեղարկել",
        "botpasswords-label-delete": "Ջնջել",
-       "botpasswords-label-resetpassword": "Õ\8eÕ¥Ö\80Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80ը",
+       "botpasswords-label-resetpassword": "Õ\8eÕ¥Ö\80Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼ը",
        "botpasswords-label-grants-column": "Թույլատրված է",
        "botpasswords-bad-appid": "\"$1\" բոտի անունն անթույլատրելի է:",
        "botpasswords-created-title": "Բոտի ծածկագիրը ստեղծվել է",
        "botpasswords-created-body": "$2 մասնակցի $1 բոտի համար բոտի ծածկագիրը ստեղծվել է:",
-       "botpasswords-updated-title": "Ô²Õ¸Õ¿Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80ը թարմացվել է",
-       "botpasswords-updated-body": "$2 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« $1 Õ¢Õ¸Õ¿Õ« Õ°Õ¡Õ´Õ¡Ö\80 Õ¢Õ¸Õ¿Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80Õ¨ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Õ¬ Õ§:",
-       "botpasswords-deleted-title": "Ô²Õ¸Õ¿Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80Õ¨ Õ»Õ¶Õ»Õ¾Õ¡Õ® Õ§",
+       "botpasswords-updated-title": "Ô²Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼ը թարմացվել է",
+       "botpasswords-updated-body": "$2 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« $1 Õ¢Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Ö\83Õ¸Ö\83Õ¸Õ­Õ¾Õ¥Ö\81:",
+       "botpasswords-deleted-title": "Ô²Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ»Õ¶Õ»Õ¾Õ¥Ö\81",
        "botpasswords-deleted-body": "$2 մասնակցի $1 բոտի համար բոտի ծածկագիրը ջնջվել է:",
        "resetpass_forbidden": "Գաղտնաբառը չի կարող փոխվել",
        "resetpass-no-info": "Այս էջին ուղիղ դիմելու համար անհրաժեշտ է մտնել համակարգ։",
        "saveprefs": "Հիշել",
        "restoreprefs": "Զրոյացնել, բերելով իլռելայն նախընտրանքներին (բոլոր բաժիններում)",
        "prefs-editing": "Խմբագրում",
-       "rows": "Տողեր`",
-       "columns": "Սյունակներ",
        "searchresultshead": "Որոնում",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Պատառ հոդվածների հղումների</a> ձևավորման որոշման սահմանը.",
        "stub-threshold-sample-link": "օրինակ",
index 7430931..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",
        "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",
        "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",
        "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",
        "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:",
        "editusergroup": "Cargar gruppos de usator",
        "editinguser": "Cambia le derectos del {{GENDER:$1|usator}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Ecce le derectos del {{GENDER:$1|usator}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modificar gruppos de usatores",
-       "userrights-viewusergroup": "Vider gruppos del usator",
+       "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-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.",
        "group": "Gruppo:",
        "group-user": "Usatores",
        "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\".",
        "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}}.\n{{GENDER:$2|Le}} message ha essite inviate directemente al {{GENDER:$1|expeditor|expeditrice}} original, revelante {{GENDER:$2|tu}} adresse de e-mail a {{GENDER:$1|ille|illa}}.",
+       "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",
        "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",
        "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 sito 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 ha succedite, ma le servitor non ha fornite alcun information sur 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-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-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",
        "usercssispublic": "Nota ben: Subpaginas CSS non debe continer datos confidential perque altere usatores pote vider los.",
        "restrictionsfield-badip": "Adresse o intervallo IP non valide: $1",
        "restrictionsfield-label": "Intervallos IP permittite:",
-       "restrictionsfield-help": "Un adresse IP o intervallo CIDR per linea. Pro activar toto, usa<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "Un adresse IP o intervallo CIDR per linea. Pro activar toto, usa:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "version $1",
        "pageid": "ID de pagina $1"
 }
index 45be55c..c8c6fa0 100644 (file)
@@ -50,7 +50,8 @@
                        "Beeyan",
                        "Bonaditya",
                        "Irus",
-                       "Presidenvolksraad"
+                       "Presidenvolksraad",
+                       "Hidayatsrf"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "searcharticle": "Lanjut",
        "history": "Riwayat halaman",
        "history_short": "Versi terdahulu",
+       "history_small": "riwayat",
        "updatedmarker": "diubah sejak kunjungan terakhir saya",
        "printableversion": "Versi cetak",
        "permalink": "Pranala permanen",
        "selfredirect": "<strong>Peringatan:</strong> Anda mengalihkan halaman ini kembali ke halaman semula.\nAnda bisa jadi telah memberikan tujuan pengalihan yang salah, atau telah menyunting halaman yang salah.\nJika Anda mengeklik \"{{int:savearticle}}\" sekali lagi, halaman pengalihan akan dibuat.",
        "missingcommenttext": "Harap masukkan komentar di bawah ini.",
        "missingcommentheader": "'''Peringatan:''' Anda belum memberikan subjek atau judul untuk komentar Anda. Jika Anda kembali menekan \"{{int:savearticle}}\", suntingan Anda akan disimpan tanpa komentar tersebut.",
-       "summary-preview": "Pratayang ringkasan:",
+       "summary-preview": "Pratayang ringkasan suntingan:",
        "subject-preview": "Pratayang subjek:",
        "previewerrortext": "Kesalahan terjadi saat mencoba memperlihatkan pratayang perubahan Anda.",
        "blockedtitle": "Pengguna diblokir",
        "search-interwiki-caption": "Proyek lain",
        "search-interwiki-default": "Hasil dari $1:",
        "search-interwiki-more": "(selanjutnya)",
+       "search-interwiki-more-results": "Hasil lainnya",
        "search-relatedarticle": "Berkaitan",
        "searchrelated": "berkaitan",
        "searchall": "semua",
        "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",
        "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:",
        "editusergroup": "Muat kelompok pengguna",
        "editinguser": "Mengubah hak pengguna untuk {{GENDER:$1|pengguna}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Melihat hak pengguna dari {{GENDER:$1|pengguna}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Sunting kelompok pengguna",
-       "userrights-viewusergroup": "Lihat kelompok pengguna",
+       "userrights-editusergroup": "Sunting kelompok {{GENDER:$1|pengguna}}",
+       "userrights-viewusergroup": "Lihat kelompok {{GENDER:$1|pengguna}}",
        "saveusergroups": "Simpan kelompok {{GENDER:$1|pengguna}}",
        "userrights-groupsmember": "Anggota dari:",
        "userrights-groupsmember-auto": "Anggota implisit dari:",
        "userrights-changeable-col": "Kelompok yang dapat Anda ubah",
        "userrights-unchangeable-col": "Kelompok yang tidak dapat Anda ubah",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "Udang $1",
+       "userrights-expiry-none": "Tidak usang",
+       "userrights-expiry": "Usang:",
+       "userrights-expiry-othertime": "Waktu lain:",
        "userrights-conflict": "Konflik perubahan hak pengguna! Silakan tinjau ulang dan konfirmasi perubahan Anda.",
        "group": "Kelompok:",
        "group-user": "Pengguna",
        "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-restore-default-filters": "Kembalikan filter bawaan",
+       "rcfilters-clear-all-filters": "Hapus semua penyaringan",
+       "rcfilters-search-placeholder": "Filter perubahan terbaru (jelajahi atau masukan input)",
+       "rcfilters-invalid-filter": "Penyqringan tidak sah",
+       "rcfilters-empty-filter": "Tidak ada filter aktif. Semua kontribusi ditampilkan.",
+       "rcfilters-filterlist-title": "Penyaringan",
+       "rcfilters-filterlist-feedbacklink": "Berikan umpan balik untuk filter uji coba baru",
+       "rcfilters-highlightmenu-title": "Pilih warna",
+       "rcfilters-filterlist-noresults": "Tidak ada penyaring ditemukan",
+       "rcfilters-filtergroup-registration": "Pendaftaran pengguna",
+       "rcfilters-filter-registered-label": "Terdaftar",
+       "rcfilters-filter-registered-description": "Penyunting masuk log",
+       "rcfilters-filter-unregistered-label": "Tidak terdaftar",
+       "rcfilters-filter-unregistered-description": "Penyunting yang tidak masuk log",
+       "rcfilters-filter-editsbyself-label": "Suntingan Anda",
+       "rcfilters-filter-editsbyself-description": "Suntingan oleh Anda",
+       "rcfilters-filter-editsbyother-label": "Suntingan orang lain",
+       "rcfilters-filter-editsbyother-description": "Suntingan dibuat oleh orang lain (bukan Anda)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Pendatang baru",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Kurang dari 10 suntingan dan aktivitas selama 4 hari.",
+       "rcfilters-filter-userExpLevel-learner-label": "Pelajar",
+       "rcfilters-filter-userExpLevel-experienced-label": "Pengguna berpengalaman",
+       "rcfilters-filtergroup-automated": "Kontribusi otomatis",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Suntingan yang dibuat dengan perkakas terotomatisasi.",
+       "rcfilters-filter-humans-label": "Manusia (bukan bot)",
+       "rcfilters-filter-humans-description": "Suntingan yang dibuat oleh penyunting manusia.",
+       "rcfilters-filtergroup-significance": "Kepentingan",
+       "rcfilters-filter-minor-label": "Suntingan kecil",
+       "rcfilters-filter-minor-description": "Suntingan yang ditandai penyunting sebagai suntingan kecil",
+       "rcfilters-filter-major-label": "Suntingan yang bukan suntingan kecil",
+       "rcfilters-filter-major-description": "Suntingan yang ditandai sebagai suntingan kecil",
+       "rcfilters-filtergroup-changetype": "Jenis perubahan",
+       "rcfilters-filter-pageedits-label": "Suntingan halaman",
+       "rcfilters-filter-pageedits-description": "Suntingan pada konten wiki, diskusi, deskripsi kategori....",
+       "rcfilters-filter-newpages-label": "Pembuatan halaman",
+       "rcfilters-filter-newpages-description": "Suntingan yang membuat halaman baru",
+       "rcfilters-filter-categorization-label": "Perubahan kategori",
+       "rcfilters-filter-categorization-description": "Rekam jejak halaman yang telah ditambahkan atau dihapus dari kategori.",
+       "rcfilters-filter-logactions-label": "Tindakan tercatat",
+       "rcfilters-filter-logactions-description": "Tindakan administratif, pembuatan akun, penghapusan halaman, pengunggahan....",
        "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",
        "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.",
        "apisandbox-sending-request": "Mengirim permintaan API...",
        "apisandbox-loading-results": "Menerima hasil API...",
        "apisandbox-results-error": "Sebuah galat terjadi ketika memuat permintaan respon API: $1.",
+       "apisandbox-request-selectformat-label": "Tampilkan permintaan data sebagai:",
        "apisandbox-request-url-label": "URL Permintaan:",
+       "apisandbox-request-json-label": "Meminta JSON:",
        "apisandbox-request-time": "Lama permintaan: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Perbaiki token dan kirim kembali",
        "apisandbox-results-fixtoken-fail": "Gagal mendapatkan token \"$1\".",
        "apisandbox-alert-field": "Nilai dalam kolom ini tidak valid.",
        "apisandbox-continue": "Lanjutkan",
        "apisandbox-continue-clear": "Kosongkan",
+       "apisandbox-param-limit": "Masukan <kbd>max</kbd> untuk menggunakan batas maksimum.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Semua ruang nama)",
+       "apisandbox-multivalue-all-values": "$1 (Semua nilai)",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Cari di sumber buku",
        "booksources-isbn": "ISBN:",
        "booksources-search": "Cari",
        "booksources-text": "Di bawah ini adalah daftar pranala ke situs lain yang menjual buku baru dan bekas, dan mungkin juga mempunyai informasi lebih lanjut mengenai buku yang sedang Anda cari:",
        "booksources-invalid-isbn": "ISBN yang diberikan tampaknya tidak valid; periksa kesalahan penyalinan dari sumber asli.",
+       "magiclink-tracking-rfc": "Halaman menggunakan pranala magis RFC",
+       "magiclink-tracking-pmid": "Halaman menggunakan pranala magis PMID",
+       "magiclink-tracking-isbn": "Halaman yang menggunakan pranala magis ISBN",
        "specialloguserlabel": "Pengguna:",
        "speciallogtitlelabel": "Target (judul atau{{ns:pengguna}}:nama pengguna untuk pengguna)",
        "log": "Catatan (Log)",
        "activeusers-intro": "Berikut adalah daftar pengguna yang memiliki suatu bentuk aktivitas selama paling tidak $1 {{PLURAL:$1|hari|hari}} terakhir.",
        "activeusers-count": "$1 {{PLURAL:$1|aktivitas|aktivitas}} dalam {{PLURAL:$3|1 hari|$3 hari}} terakhir",
        "activeusers-from": "Tampilkan pengguna mulai dari:",
+       "activeusers-groups": "Tampilkan pengguna yang termasuk kelompok:",
+       "activeusers-excludegroups": "Sembunyikan pengguna yang termasuk kelompok:",
        "activeusers-noresult": "Pengguna tidak ditemukan.",
        "activeusers-submit": "Tampilkan pengguna aktif",
        "listgrouprights": "Daftar hak kelompok",
        "rollbacklinkcount-morethan": "kembalikan lebih dari $1 {{PLURAL:$1|suntingan|suntingan}}",
        "rollbackfailed": "Pengembalian gagal dilakukan",
        "rollback-missingparam": "Parameter dibutuhkan ketika diminta tidak tersedia.",
+       "rollback-missingrevision": "Tidak mampu memuat data revisi.",
        "cantrollback": "Tidak dapat membatalkan suntingan;\nkontributor terakhir adalah satu-satunya penulis halaman ini.",
        "alreadyrolled": "Tidak dapat melakukan pengembalian ke revisi terakhir [[:$1]] oleh [[User:$2|$2]] ([[User talk:$2|bicara]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\npengguna lain telah menyunting atau melakukan pengembalian terhadap halaman ini.\n\nSuntingan terakhir dilakukan oleh [[User:$3|$3]] ([[User talk:$3|bicara]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Komentar penyuntingan adalah: <em>$1</em>.",
        "revertpage": "←Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]]) dibatalkan ke versi terakhir oleh [[User:$1|$1]]",
        "revertpage-nouser": "Mengembalikan suntingan oleh (nama pengguna dihapus) ke suntingan terakhir oleh [[User:$1|$1]]",
-       "rollback-success": "Pembatalan suntingan oleh $1; dibatalkan ke versi terakhir oleh $2.",
+       "rollback-success": "Pembatalan suntingan oleh {{GENDER:$3|$1}}; dibatalkan ke versi terakhir oleh {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Mengembalikan suntingan oleh $1; rubah kembali untuk revisi terakhir oleh $2. [$3 Lihat perubahan]",
        "sessionfailure-title": "Kegagalan sesi",
        "sessionfailure": "Sepertinya ada masalah dengan sesi log Anda; log Anda telah dibatalkan untuk mencegah pembajakan. Silakan tekan tombol \"kembali\" dan muat kembali halaman sebelum Anda masuk, lalu coba lagi.",
        "sorbs": "DNSBL",
        "sorbsreason": "Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL.",
        "sorbs_create_account_reason": "Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL. Anda tidak dapat membuat akun.",
+       "softblockrangesreason": "Kontribusi anonim tidak diizinkan dari alamat IP Anda ($1). Silakan masuk log.",
        "xffblockreason": "Sebuah alamat IP terdapat di kepala X-Forwarded-For, entah milik Anda atau peladen ''proxy'' yang Anda gunakan, telah diblokir. Alasan pemblokirannya adalah: $1",
        "cant-see-hidden-user": "Pengguna yang Anda coba blokir telah diblokir dan disembunyikan. Selama Anda tidak memiliki hak sembunyikan pengguna, Anda tidak dapat melihat atau menyunting pemblokiran pengguna ini.",
        "ipbblocked": "Anda tidak dapat memblokir atau membuka blokir pengguna lain, karena Anda sendiri diblokir.",
        "cant-move-to-user-page": "Anda tidak memiliki hak akses untuk memindahkan halaman ke suatu halaman pengguna (kecuali ke subhalaman pengguna).",
        "cant-move-category-page": "Anda tidak memiliki izin untuk memindahkan halaman kategori.",
        "cant-move-to-category-page": "Anda tidak memiliki izin untuk memindahkan halaman ke halaman kategori.",
+       "cant-move-subpages": "Anda tidak memiliki izin untuk memindahkan subhalaman",
+       "namespace-nosubpages": "Ruang nama \"$1\" tidak mengizinkan subhalaman.",
        "newtitle": "Judul baru:",
        "move-watch": "Pantau halaman ini",
        "movepagebtn": "Pindahkan halaman",
        "newimages-showbots": "Tampilkan unggahan oleh bot",
        "newimages-hidepatrolled": "Sembunyikan unggahan yang telah dipatroli",
        "noimages": "Tidak ada yang dilihat.",
+       "gallery-slideshow-toggle": "Beralih  ''thumbnails''",
        "ilsubmit": "Cari",
        "bydate": "berdasarkan tanggal",
        "sp-newimages-showfrom": "Tampilkan berkas baru dimulai dari $2, $1",
        "tag-filter": "Filter [[Special:Tags|tag]]:",
        "tag-filter-submit": "Penyaring",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
+       "tag-mw-contentmodelchange": "Perubahan model konten",
+       "tag-mw-contentmodelchange-description": "Perubahan yang [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel mengubah model konten] suatu halaman",
        "tags-title": "Tanda",
        "tags-intro": "Halaman ini berisi daftar tag yang dapat ditandai oleh perangkat lunak terhadap suatu suntingan berikut artinya.",
        "tags-tag": "Nama tag",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Tag|Tag}} berikut tidak diizinkan untuk diterapkan secara manual: $1",
        "tags-update-no-permission": "Anda tidak memiliki izin untuk menambah atau menghapus perubahan tag dari revisi atau entri log individu.",
        "tags-update-blocked": "Anda tidak dapat menambahkan atau menghapus perubahan tag ketika {{GENDER:$1|Anda}} sedang diblokir.",
+       "tags-update-add-not-allowed-one": "Tag \"$1\"tidak diizinkan untuk ditambahkan secara manual.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|tag is|Tag ini}} tidak diizinkan untuk ditambahkan secara manual: $1",
+       "tags-update-remove-not-allowed-one": "Tag \"$1\" tidak diizinkan untuk dihapus.",
        "tags-edit-title": "Sunting tag",
        "tags-edit-manage-link": "Kelola tag",
        "tags-edit-revision-selected": "{{PLURAL:$1|Revisi terpilih|Revisi terpilih}} dari [[:$2]]:",
        "htmlform-time-placeholder": "JJ:MM:DD",
        "htmlform-datetime-placeholder": "TTTT-BB-HH JJ:MM:DD",
        "htmlform-date-invalid": "Nilai yang diberikan tidak dikenali sebagai tanggal. Coba lagi menggunakan format TTTT-BB-HH.",
+       "htmlform-time-invalid": "Nilai yang Anda tentukan bukan waktu yang dikenali. Cobalah menggunakan format HH:MM:SS",
        "htmlform-datetime-invalid": "Nilai yang Anda masukkan tidak dikenali sebagai tanggal dan waktu. Coba gunakan format YYYY-MM-DD HH:MM:SS",
        "htmlform-date-toolow": "Nilai yang Anda masukkan adalah sebelum tanggal paling dini yang dibolehkan $1",
        "htmlform-date-toohigh": "Nilai yang Anda masukkan adalah setelah tanggal paling akhir  yang dibolehkan $1",
        "htmlform-time-toolow": "Nilai yang Anda tentukan adalah sebelum waktu paling dini yang dibolehkan $1",
        "htmlform-time-toohigh": "Nilai yang Anda tentukan adalah setelah waktu paling baru yang dibolehkan $1",
+       "htmlform-datetime-toolow": "Nilai yang Anda tentukan berada sebelum tanggal dan waktu paling awal yang diperbolehkan $1",
+       "htmlform-datetime-toohigh": "Nilai yang Anda masukan telah terlewati setelah tanggal dan waktu terakhir yang diperbolehkan $1.",
        "htmlform-title-badnamespace": "[[:$1]] tidak berada dalam ruang nama \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" bukan merupakan judul halaman yang dapat dibuat",
        "htmlform-title-not-exists": "$1 tidak ada.",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|memperbarui}} tag pada entri log $5 dari halaman $3 ({{PLURAL:$7|menambahkan}} $6; {{PLURAL:$9|menghapus}} $8)",
        "rightsnone": "(tidak ada)",
        "revdelete-summary": "ringkasan",
+       "rightslogentry-temporary-group": "$1 (sementara, hingga $2)",
        "feedback-adding": "Menambahkan umpan balik ke halaman...",
        "feedback-back": "Kembali",
        "feedback-bugcheck": "Hebat! Hanya periksa bahwa itu bukan satu di antara [$1 bug yang telah dikenal].",
        "feedback-useragent": "Agen pengguna:",
        "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}}",
        "pagelang-language": "Bahasa",
        "pagelang-use-default": "Gunakan bahasa baku",
        "pagelang-select-lang": "Pilih bahasa",
+       "pagelang-reason": "Alasan",
        "pagelang-submit": "Kirim",
+       "pagelang-nonexistent-page": "Halaman $1 tidak tersedia",
+       "pagelang-unchanged-language": "Halaman $1 telah di atur ke bahasa $2",
+       "pagelang-unchanged-language-default": "Halaman $1 Telah diatur ke bahasa konten bawaan.",
+       "pagelang-db-failed": "Basis data gagal mengubah bahasa halaman",
        "right-pagelang": "Ubah bahasa halaman",
        "action-pagelang": "mengubah bahasa halaman",
        "log-name-pagelang": "Log perubahan bahasa",
        "mw-widgets-titleinput-description-new-page": "halaman belum ada",
        "mw-widgets-titleinput-description-redirect": "mengalihkan ke $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Tambah sebuah kategori...",
+       "mw-widgets-usersmultiselect-placeholder": "Tambahkan lebih banyak...",
        "sessionmanager-tie": "Tidak dapat menggabungkan banyak jenis otentikasi permintaan: $1.",
        "sessionprovider-generic": "sesi $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesi berdasarkan kuki",
        "sessionprovider-nocookies": "Kuki mungkin dimatikan. Pastikan Anda telah mengaktifkan kuki dan coba mulai kembali.",
        "randomrootpage": "Halaman dasar sembarang",
        "log-action-filter-block": "Jenis pemblokiran:",
-       "log-action-filter-contentmodel": "Jenis modifikasi modelkonten:",
+       "log-action-filter-contentmodel": "Jenis perubahan modelkonten:",
        "log-action-filter-delete": "Jenis penghapusan:",
        "log-action-filter-import": "Jenis impor:",
        "log-action-filter-managetags": "Jenis tindakan manajemen tag:",
        "authmanager-link-no-primary": "Kredensial yang diberikan tidak dapat digunakan untuk menautkan akun.",
        "authmanager-link-not-in-progress": "Penautan akun tidak dilanjutkan atau data sesi telah hilang. Ulang kembali dari awal.",
        "authmanager-authplugin-setpass-failed-title": "Penggantian kata sandi gagal",
+       "authmanager-authplugin-setpass-failed-message": "Plugin autentikasi mencegah pengubahan pasword.",
+       "authmanager-authplugin-create-fail": "Plugin autentikasi mencegah pembuatan akun.",
+       "authmanager-authplugin-setpass-denied": "Plugin autentikasi tidak memperbolehkan mengubah kata kunci.",
        "authmanager-authplugin-setpass-bad-domain": "Domain tidak sah.",
        "authmanager-autocreate-noperm": "Pembuatan akun otomatis tidak diizinkan.",
        "authmanager-autocreate-exception": "Pembuatan akun otomatis dimatikan sementara karena galat sebelumnya.",
index 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 6990ca0..7c5bc69 100644 (file)
@@ -38,7 +38,7 @@
        "tog-enotifminoredits": "ОагIонашта а файлашта даь хувцамаш геттара зIамига дале а хоам бе сога",
        "tog-enotifrevealaddr": "ДIахайта хоамбараш чу бIаргадейта са почта адрес",
        "tog-shownumberswatching": "Шоаш зем бу оагIонашта юкъе ер оагIув чуяьккха доакьошхоша таьрахь гойта",
-       "tog-oldsig": "ХIанзара яздаь кулг:",
+       "tog-oldsig": "Хьа карара кулг яздар:",
        "tog-fancysig": "Кулг яздара ший йола вики-разметка (автоматически тIахьожаярг йоацаш)",
        "tog-uselivepreview": "Пайда эца сиха дола хьалххе бIаргтохар",
        "tog-forceeditsummary": "ДIахьалхадаккха, нагахьа санна хувцама йоазонца сурт оттадара моттиг хьалъйизанза яле",
        "category-file-count-limited": "Укх категори чу {{PLURAL:$1|$1 файл|$1 файлаш|1=цаI мара файл яц}}.",
        "listingcontinuesabbrev": "(дIахо)",
        "index-category": "Индекс оттаеш оагIонаш",
-       "noindex-category": "Индекс ца оттаеш оагIонаш",
+       "noindex-category": "Индекс оттайинза оагIонаш",
        "broken-file-category": "Файла тIахьожаяргаш болхбеш йоаца оагIонаш",
        "about": "Сурт оттадар",
        "article": "Статья",
        "newwindow": "&nbsp;(керда кора чу)",
        "cancel": "Юхадаккха",
        "moredotdotdot": "ДIахо...",
-       "morenotlisted": "Ð\95Ñ\80 Ñ\81пиÑ\81ок Ñ\85Ñ\8cалйиза Ñ\8fÑ\86.",
+       "morenotlisted": "Ð\95Ñ\80 Ñ\85Ñ\8cаÑ\8fзÑ\8fÑ\8cÑ\80 Ñ\85Ñ\8cалйизанза Ñ\85ила Ð¼ÐµÐ³Ð°Ñ\88 Ñ\8f.",
        "mypage": "ОагIув",
        "mytalk": "Дувца оттадар",
        "anontalk": "Дувца оттадар",
        "showpreview": "Хьалххе бIаргтохар",
        "showdiff": "Даь дола хувцамаш",
        "anoneditwarning": "<strong>Теркам бе!</strong> Хьо автор хинна система чуваьннавац. Нагахьа санна Iа моллагIа хувцам бой, Хьа IP-адрес дийла массанен бIаргагуш хургда. Нагахьа санна Хьо <strong>[$1 хьачувоале]</strong> е <strong>[$2 дагара йоазув хьакхолле]</strong>, нийсдараш (хувцамаш) бувзам болаш хургда Хьа доакъашхой цIерца, иштта кхыдола толажагIи гIойленагIи дола дикаьш хургда Хьона.",
-       "summary-preview": "СÑ\83Ñ\80Ñ\82 Ð¾Ñ\82Ñ\82адаÑ\80 Ñ\85Ñ\83Ñ\80гда:",
-       "subject-preview": "Ð\94аÑ\8cкÑ\8aа Ñ\86Iи Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f Ð¸Ñ\88Ñ\82Ñ\82а:",
+       "summary-preview": "Ð¥Ñ\83вÑ\86ама Ñ\81Ñ\83Ñ\80Ñ\82 Ð¾Ñ\82Ñ\82адаÑ\80а Ñ\85Ñ\8cалÑ\85е Ð±IаÑ\80гÑ\82оÑ\85аÑ\80:",
+       "subject-preview": "Теман/коÑ\80Ñ\82баÑ\80а Ñ\85Ñ\8cалÑ\85Ñ\85е Ð±IаÑ\80гÑ\82оÑ\85аÑ\80:",
        "blockedtitle": "Доакъашхочун чIега техаб",
        "blockednoreason": "бахьан белгалдаьккха дац",
        "loginreqlink": "довзийта",
        "notextmatches": "ОагIонай тексташта юкъе цхьатара хилар дац",
        "prevn": "{{PLURAL:$1|1=хьалхайогIар|хьалхайогIараш}} $1",
        "nextn": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
-       "prevn-title": "{{PLURAL:$1|1=$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}",
+       "prevn-title": "{{PLURAL:$1|ХьалхадоагIа $1 дIаяздар}}",
        "nextn-title": "{{PLURAL:$1|ТIадоагIа $1 яздар|ТIадоагIа $1 яздараш}}",
        "shown-title": "Гойта $1 {{PLURAL:$1|яздаьр|яздаьраш}} укх оáгIон тIа",
        "viewprevnext": "ДIахьажа ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-exists": "'''Укх вики чу йолаш я оагӀув «[[:$1]]»'''",
+       "searchmenu-exists": "'''Укх вики чу я иштта йола оагӀув «[[:$1]]»'''",
        "searchmenu-new": "<strong>Хьакхолла оагIув «[[:$1]]» укх вики-проекте!</strong>\n{{PLURAL:$2|0=|Иштта хьажа Iайха лийха оагIонга.|Иштта хьажа хьай лахара хьахиннарашка.}}",
        "searchprofile-articles": "Кертера оагIонаш",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything-tooltip": "Массайола оагIонаш тIа лахар (дувцар оттадара оагIонаш чулоацаш)",
        "searchprofile-advanced-tooltip": "Iочуязаяь цIерий аренашка лаха",
        "search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешаш}})",
-       "search-result-category-size": "{{PLURAL:$1|1=$1 дакъа|$1 дакъаш}} ({{PLURAL:$2|1=$2 кIалцатег|$2 кIалцатегаш}}, {{PLURAL:$3|1=$3 паьла|$3 паьлий}})",
+       "search-result-category-size": "$1 {{PLURAL:$1|юкъедахар}} ($2 {{PLURAL:$2|кIалкатегори}}, $3 {{PLURAL:$3|файл}})",
        "search-redirect": "(дIа-хьахьожадар $1 тIара)",
        "search-section": "(дáкъа «$1»)",
        "search-suggest": "Хьона эшар ер хила мега: $1",
        "prefs-signature": "Кулг яздар",
        "prefs-preview": "Хьалххе бIаргтохар",
        "userrights-user-editname": "Iочуязъе доакъашхочун цӀи:",
-       "editusergroup": "Ð¥Ñ\83вÑ\86а {{GENDER:$1|доакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н}} тоабаш",
+       "editusergroup": "Ð\99оÑ\82Ñ\82а Ð´Ð¾Ð°ÐºÑ\8aаÑ\88Ñ\85ой тоабаш",
        "saveusergroups": "ДIаязъе {{GENDER:$1|доакъашхочун}} тоабаш",
        "userrights-groupsmember": "Дакъа лоаца тоабаш чу:",
        "userrights-reason": "Бахьан:",
        "recentchanges-label-plusminus": "байташкахь боарам хувцар",
        "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа иштта [[Special:NewPages|керда оагIонашка]])",
-       "rcnotefrom": "КIалхагIа хувцамаш хьахьекха я <strong>$2</strong> денза (<strong>$1</strong> кхачалца).",
+       "rcnotefrom": "КIалхагIа {{PLURAL:$5|хувцам белгалбаьккхаб}} <strong>$3, $4</strong> тIера (хьахьекхабац <strong>$1</strong>-л дукхагIа).",
        "rclistfrom": "$3 $2 денза даь хувцамаш хьахьокха",
        "rcshowhideminor": "$1 зIамига нийсдараш",
        "rcshowhideminor-show": "Хьахьокха",
        "newpages": "Керда оагIонаш",
        "move": "ЦIи хувца",
        "movethispage": "ЦIи хувца укх оагIон",
-       "pager-newer-n": "{{PLURAL:$1|кердагIа дара|кердагIа дараш|кердагIа долачаьрахь}} $1",
+       "pager-newer-n": "$1 дукхагIа {{PLURAL:$1|керда}}",
        "pager-older-n": "{{PLURAL:$1|къаьнара дара|къаьнара дараш|къаьнара долaчарех}} $1",
        "booksources": "Джейнай хьасташ (источники)",
        "booksources-search-legend": "Джейнах лаьца хоам лахар",
        "protect_expiry_old": "Чакхадалара ха — дахáр да.",
        "protect-text": "Хьа йиш я оагIон '''$1''' лорадара лагIа бIаргтоха a, хувца a .",
        "protect-locked-access": "Хьа дагара йоазонга тоъал бокъо яц оагIон лорадара лагIа хувца. '''$1''' оагIон карара оттадараш:",
-       "protect-cascadeon": "{{PLURAL:$1|1=КIалхахь хьагойташ йола оагIувчу|КIалхахь хьагойташ йола оагIувнашчу}} ер оагIув чуяккха халарахь, лорам Iоттая я, хурхала лорам Iоттая я. Укх оагIувни лорама лагIа хувца йийш йолаш я, амма хурхала лорам хувцлургдац.",
+       "protect-cascadeon": "Каскадни лорадар оттадаь йолча {{PLURAL:$1|1=кIалхагIа белгалъяь оагIон чу|кIалхагIа белгалъяь оагIонаш чу}} юкъеяьккха хилара бахьане ер оагIув хIанза лораяь я. Укх оагIон лорадара дарж хувцаро каскадни лорадар меттахдоаккхадац.",
        "protect-default": "Лорадар доацаш",
        "protect-fallback": "Могадаьд алхха ше «$1» волача доакъашхошта",
        "protect-level-autoconfirmed": "Могадаьд алхха ше-ше къоабалбаь хинна доакъашхошта",
        "unblocklogentry": "чIега баьстаб $1",
        "block-log-flags-nocreate": "дагара йоазонаш кхоллар пурам деннадац",
        "move-page-legend": "ОагIон цIи хувцар",
-       "movepagetext": "КIалхара кепаца болхабеча, оаш оагIувни цIи хувцаргья, цунна хувцамий тептар кхыйола меттиге дIачудоаккхаш.\nКIаьнара цIерахь керда цIерий дIачудаккхам хургда.\nКIаьнара цIера тIа даь дола дIачудаккхамаш, шун ший лоIамахь кердадаккха йийш хургья.\nИз оаш ца дой, дехар да, [[Special:DoubleRedirects|шолха]] кхы [[Special:BrokenRedirects|вIашагIаяккха дIачудаккхамий]] кардоламахь хьажа.\nОаш жоп лу, шоай чуяккха йола Iинкаш, даим болхбеш хургдолга.\n\nЗем бахка, оагIувни цIи хувцалургьяц, изза мо цIи йолаш оагIув хилача. \nЙолаш йола оагIув хувца йийш яц, амма хийца йола оагIув юха хьахувца йийш я. \n\n'''Хоамхайтар'''\n\nЦIи хувцар, йовзаш йола оагIувнаший, доккха а цаьхха а хувцамшка дIатIадала мегаш да.\nДехар да, оаш дIахо болх белаьхь, хургдола хIама кхеташ долга, кхеталаш.",
-       "movepagetalktext": "ТIаÑ\82еÑ\85а Ð´Ñ\83вÑ\86ама Ð¾Ð°Ð³IÑ\83в, Ñ\88ий Ð»Ð¾IамаÑ\85Ñ\8c Ñ\86Iи Ñ\85Ñ\83влÑ\83Ñ\80гÑ\8cÑ\8f, '''еÑ\80 Ð´Ð°Ð³Ð° Ð° Ð´Ð¾Ð°Ñ\86аÑ\80, Ð´Ð¾Ð°Ñ\86а:'''\n\n*Ð\98зза Ð¼Ð¾ Ñ\86Iи Ð¹Ð¾Ð»Ð°Ñ\88 Ñ\8fÑ\8cÑ\81Ñ\81а Ð´Ñ\83вÑ\86ама Ð¾Ð°Ð³IÑ\83в Ñ\8f Ðµ\n*Ð\9eаÑ\88 ÐºIалÑ\85аÑ\85Ñ\8c Ð±ÐµÐ»Ð³Ð°Ð»Ð¾ Ð´Ð°Ñ\8cдаÑ\86.\n\nÐ\98з Ð¸Ñ\88Ñ\82Ñ\82а Ð´Ð°Ð»Ðµ, ÐºÑ\83лги Ð½Ð¾Ð²ÐºÑ\8aоÑ\81Ñ\82алÑ\86а Ð¾Ð°Ð³IÑ\83внаÑ\88 Ð²IаÑ\88агIаÑ\82оÑ\85а  Ðµ Ð´IадеÑ\85Ñ\8cаÑ\8fккÑ\85а Ð´ÐµÐ·Ð° Ñ\88Ñ\83н.",
+       "movepagetext": "КIалха белгаляьча формах пайда ийца Iа оагIон цIи хувцаргья, цун хувцамий тептар кхыйола моттиге оттаярца цхьанна.\nКъаьнарча цIерах хургья кердача цIера дIа-сахьожадар.\nХьа аьттув ба къаьнарча цIера хинна дIа-сахьожадараш ше-ше кердадаккха.\nНагахьа санна Iа из ца дой, дехар ду, [[Special:DoubleRedirects|шолха]]  а [[Special:BrokenRedirects|хеттанза дIа-сахьожадараш]] долаш дий тахка.\nХьо бехктокхаме ва тIахьожаяргаш шоаш тIахьожаде дезача нийса хилар.\n\nТеркам бе, оагIон цIи <strong>хувцалургьйоацалга</strong> нагахьа санна изза мо цIи йола оагIув йолаш яле. Чу хIама доацача оагIонашта е дIа-сахьожадарашта, кхы а цар хувцамий истори йице, из новкъа дац. Из яхилга да, нагахьа Iа харца цIи хувцар даь дале, ше хинна цIи юхадIахувца йиш я, амма бакъда йолаш йола оагIув ца ховш дIаяккха аьттув бац. \n\n<strong>Белгалдоахар:</strong>\nГIоряьннача оагIонай цIи хувцаро тIехдоккхеи цIаьххеи хувцамаш доаладе мега.\nБоккъала, дIахо хье дIавахалехьа, кхета, хила мегаш дар хургдолга.",
+       "movepagetalktext": "Ð\9dагаÑ\85Ñ\8cа Ñ\81анна Iа ÐµÑ\80 Ð¿Ñ\83нкÑ\82 Ð±ÐµÐ»Ð³Ð°Ð»Ñ\8aйой, Ñ\86Ñ\83нÑ\86а Ð±Ñ\83взам Ð±Ð¾Ð»Ð° Ð´Ñ\83вÑ\86а Ð¾Ñ\82Ñ\82адаÑ\80а Ð¾Ð°Ð³IÑ\83в Ð¸Ñ\88Ñ\82Ñ\82а Ñ\88е-Ñ\88е Ñ\86Iи Ñ\85ийÑ\86а Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f, Ð½Ð°Ð³Ð°Ñ\85Ñ\8cа Ñ\81анна Ð¸Ð·Ð·Ð° Ð¼Ð¾ Ñ\86Iи Ð¹Ð¾Ð»Ð° Ñ\8fÑ\8cÑ\81Ñ\81а Ð¹Ð¾Ð°Ñ\86а Ð´Ñ\83вÑ\86а Ð¾Ñ\82Ñ\82адаÑ\80а Ð¾Ð°Ð³IÑ\83в Ð¹Ð¾Ð»Ð°Ñ\88 Ð¹Ð¸Ñ\86е.\n\nÐ\98з Ð¸Ñ\88Ñ\82Ñ\82а Ð´Ð°Ð»Ðµ, Ð½Ð°Ð³Ð°Ñ\85Ñ\8cа Ð¸Ð· Ñ\8dÑ\88аÑ\88 Ð´Ð°Ð»Ðµ, IайÑ\85а Ð¾Ð°Ð³Iон  Ñ\86Iи Ð´IаÑ\85Ñ\83вÑ\86а.",
        "newtitle": "Керда цIи:",
        "move-watch": "Ер оагIув зем бара хьаязъяьра юкъеяьккха",
        "movepagebtn": "ОагIон цIи хувца",
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 c32f4a3..57fefb1 100644 (file)
                        "Anto",
                        "Saracrovetto",
                        "Tosky",
-                       "Selven"
+                       "Selven",
+                       "Margherita.mignanelli",
+                       "Redredsonia"
                ]
        },
        "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",
        "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.",
        "notloggedin": "Accesso non effettuato",
        "userlogin-noaccount": "Non hai ancora effettuato la registrazione?",
        "userlogin-joinproject": "Registrati su {{SITENAME}}",
-       "nologin": "Non hai ancora un accesso? $1.",
+       "nologin": "Non hai un'utenza? $1.",
        "nologinlink": "Registrati",
        "createaccount": "Registrati",
-       "gotaccount": "Hai già un accesso? $1.",
+       "gotaccount": "Hai già un'utenza? $1.",
        "gotaccountlink": "Entra",
        "userlogin-resetlink": "Hai dimenticato i tuoi dati di accesso?",
        "userlogin-resetpassword-link": "Hai dimenticato la password?",
        "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)",
        "nextn-title": "{{PLURAL:$1|Risultato successivo|$1 risultati successivi}}",
        "shown-title": "Mostra {{PLURAL:$1|un risultato|$1 risultati}} per pagina",
        "viewprevnext": "Vedi ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-exists": "'''Sul sito esiste una pagina il cui nome è \"[[:$1]]\"'''",
+       "searchmenu-exists": "<strong>Su questo wiki esiste una pagina il cui nome è \"[[:$1]]\".</strong> {{PLURAL:$2|0=|Vedi anche gli altri risultati trovati.}}",
        "searchmenu-new": "<strong>Crea la pagina \"[[:$1]]\" su questo wiki!</strong> {{PLURAL:$2|0=|Vedi anche la pagina trovata con la tua ricerca|Vedi anche i risultati della ricerca}}",
        "searchprofile-articles": "Pagine di contenuti",
        "searchprofile-images": "Multimedia",
        "search-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",
        "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",
        "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:",
        "editusergroup": "Modifica gruppi utente",
        "editinguser": "Modifica in corso dei diritti dell'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Visualizzazione dei diritti dell'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modifica gruppi utente",
-       "userrights-viewusergroup": "Visualizza gruppi utente",
+       "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-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-existing": "Scadenza attuale: $2, $3",
+       "userrights-expiry-othertime": "Altra durata:",
+       "userrights-expiry-options": "1 giorno:1 day,1 settimana:1 week,1 mese:1 month,3 mesi:3 months,6 mesi:6 months,1 anno:1 year",
        "userrights-conflict": "Conflitto di modifica dei diritti utente! Controlla e conferma le tue modifiche.",
        "group": "Gruppo:",
        "group-user": "Utenti",
        "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-highlightmenu-title": "Seleziona un colore",
+       "rcfilters-highlightmenu-help": "Seleziona un colore per evidenziare questa proprietà",
+       "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",
        "largefileserver": "Il file supera le dimensioni consentite dalla configurazione del server.",
        "emptyfile": "Il file appena caricato sembra essere vuoto. Ciò potrebbe essere dovuto ad un errore nel nome del file. Verificare che si intenda realmente caricare questo file.",
        "windows-nonascii-filename": "Questo wiki non supporta nomi di file con caratteri speciali.",
-       "fileexists": "Un file con questo nome esiste già.\nVerificare prima <strong>[[:$1]]</strong> se non si è sicuri di volerlo sovrascrivere.\n[[$1|thumb]]",
+       "fileexists": "Un file con questo nome esiste già, verifica prima <strong>[[:$1]]</strong> se non si è sicuri di volerlo sovrascrivere.\n[[$1|thumb]]",
        "filepageexists": "La pagina di descrizione di questo file è già stata creata all'indirizzo <strong>[[:$1]]</strong>, anche se non esiste ancora un file con questo nome. La descrizione dell'oggetto inserita in fase di caricamento non apparirà sulla pagina di descrizione. Per far sì che l'oggetto compaia sulla pagina di descrizione, sarà necessario modificarla manualmente.\n[[$1|thumb]]",
        "fileexists-extension": "Un file con nome simile a questo esiste già: [[$2|thumb]]\n* Nome del file caricato: <strong>[[:$1]]</strong>\n* Nome del file esistente: <strong>[[:$2]]</strong>\nForse vuoi scegliere un nome più caratteristico?.",
        "fileexists-thumbnail-yes": "Il file caricato sembra essere una miniatura ''(thumbnail)''. [[$1|thumb]]\nVerificare, per confronto, il file <strong>[[:$1]]</strong>.\nSe si tratta della stessa immagine, nelle dimensioni originali, non è necessario caricarne altre miniature.",
        "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",
        "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}}. La {{GENDER:$2|tua}} eventuale email di risposta sarà inviata direttamente al {{GENDER:$1|mittente originale}}, rivelando il  {{GENDER:$2|tuo}} indirizzo di posta elettronica a {{GENDER:$1|lui|lei}}.",
+       "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",
        "editcomment": "L'oggetto della modifica era: <em>$1</em>.",
        "revertpage": "Annullate le modifiche di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]]), riportata alla versione precedente di [[User:$1|$1]]",
        "revertpage-nouser": "Annullate le modifiche di un utente nascosto, riportata alla versione precedente di {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Annullate le modifiche di $1; pagina riportata all'ultima versione di $2.",
+       "rollback-success": "Annullate le modifiche di {{GENDER:$3|$1}}; pagina riportata all'ultima versione di {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Annullate le modifiche di $1;\npagina riportata all'ultima revisione di $2. [$3 Mostra le modifiche]",
        "sessionfailure-title": "Sessione fallita",
        "sessionfailure": "Si è verificato un problema nella sessione che identifica l'accesso; il sistema non ha eseguito il comando impartito per precauzione. Tornare alla pagina precedente con il tasto 'Indietro' del proprio browser, ricaricare la pagina e riprovare.",
        "protect-expiry-indefinite": "infinito",
        "protect-cascade": "Protezione ricorsiva (estende la protezione a tutte le pagine incluse in questa).",
        "protect-cantedit": "Non è possibile modificare i livelli di protezione per la pagina in quanto non si dispone dei permessi necessari per modificare la pagina stessa.",
-       "protect-othertime": "Durata non in elenco:",
-       "protect-othertime-op": "durata non in elenco",
+       "protect-othertime": "Altra durata:",
+       "protect-othertime-op": "altra durata",
        "protect-existing-expiry": "Scadenza attuale: $2, $3",
        "protect-existing-expiry-infinity": "Scadenza attuale: infinito",
        "protect-otherreason": "Altri motivi/dettagli:",
        "ipbemailban": "Impedisci all'utente l'invio di email",
        "ipbenableautoblock": "Blocca automaticamente l'ultimo indirizzo IP usato dall'utente e i successivi con cui vengono tentate modifiche",
        "ipbsubmit": "Blocca l'utente",
-       "ipbother": "Durata non in elenco:",
+       "ipbother": "Altra durata:",
        "ipboptions": "2 ore:2 hours,1 giorno:1 day,3 giorni:3 days,1 settimana:1 week,2 settimane:2 weeks,1 mese:1 month,3 mesi:3 months,6 mesi:6 months,1 anno:1 year,infinito:infinite",
        "ipbhidename": "Nascondi il nome utente dalle modifiche e dagli elenchi.",
        "ipbwatchuser": "Segui le pagine e le discussioni utente di questo utente",
        "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": "{{PLURAL:$1|Esiste già un altro file|Esistono già altri file}} sul sito con lo stesso contenuto.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Esiste già un altro file|Esistono già altri file}} sul 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 restituito 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-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",
        "usercssispublic": "Ricorda: le sottopagine CSS non devono contenere dati riservati poichè sono visualizzabili da altri utenti.",
        "restrictionsfield-badip": "Indirizzo IP o intervallo non valido: $1",
        "restrictionsfield-label": "Intervalli IP consentiti:",
-       "restrictionsfield-help": "Un indirizzo IP o intervallo CIDR per linea. Per consentire tutto, utilizza<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "Un indirizzo IP o intervallo CIDR per linea. Per consentire tutto, utilizza:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "versione $1",
        "pageid": "ID della pagina $1"
 }
index e5b0f23..2c4c3ba 100644 (file)
@@ -77,7 +77,9 @@
                        "ネイ",
                        "Mirinano",
                        "Suchichi02",
-                       "にょきにょき"
+                       "にょきにょき",
+                       "おはぐろ蜻蛉",
+                       "Aefgh39622"
                ]
        },
        "tog-underline": "リンクの下線:",
        "searcharticle": "表示",
        "history": "ページの履歴",
        "history_short": "履歴",
+       "history_small": "履歴",
        "updatedmarker": "前回の閲覧以降に更新されました",
        "printableversion": "印刷用バージョン",
        "permalink": "この版への固定リンク",
        "throttled-mailpassword": "パスワード再設定メールを過去 {{PLURAL:$1|$1 時間}}に送信済みです。\n悪用防止のため、パスワードの再設定は {{PLURAL:$1|$1 時間}}に 1 回のみです。",
        "mailerror": "メールを送信する際にエラーが発生しました: $1",
        "acct_creation_throttle_hit": "あなたと同じ IP アドレスでこのウィキに訪れた人が、直近 $2 で {{PLURAL:$1|$1 個のアカウント}}を作成しており、この期間で作成が許可されている最大数です。\nそのため、現在この IP アドレスからこれ以上のアカウントを作成できません。",
-       "emailauthenticated": "メールアドレスは$2 $3に確認済みです。",
+       "emailauthenticated": "メールアドレスは$2 $3に確認済みです。",
        "emailnotauthenticated": "メールアドレスが確認されていません。\n確認されるまで、以下のいかなる機能でもメールは送信されません。",
        "noemailprefs": "これらの機能を有効にするには、個人設定でメールアドレスを登録してください。",
        "emailconfirmlink": "あなたのメールアドレスを確認",
        "passwordreset-emailsentusername": "この利用者名に関連付けられたメールアドレスがある場合は、パスワードリセットのメールが送信されます。",
        "passwordreset-ignored": "パスワードのリセットが処理されませんでした。プロバイダーが設定されていない可能性があります。",
        "passwordreset-invalidemail": "無効なメールアドレスです",
+       "passwordreset-nodata": "利用者名もメールアドレスも入力されていません",
        "changeemail": "メールアドレスの変更または除去",
        "changeemail-header": "あなたのメールアドレスを変更するには、このフォームを完成させます。もし、あなたのアカウントから任意のメールアドレスの関連付けを削除したい場合は、フォームの送信時に、新しいメールアドレスを空白のままにします。",
        "changeemail-no-info": "このページに直接アクセスするためにはログインしている必要があります。",
        "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": "サンプル",
        "userrights-changeable-col": "変更できるグループ",
        "userrights-unchangeable-col": "変更できないグループ",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "期限 $1",
+       "userrights-expiry-none": "有効期限切れではありません",
+       "userrights-expiry": "有効期限:",
+       "userrights-expiry-othertime": "その他の期間:",
        "userrights-conflict": "利用者権限の変更が競合しています! 変更内容を確認してください。",
        "group": "グループ:",
        "group-user": "登録利用者",
        "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]] へ移動しました",
        "pageinfo-length": "ページの長さ (バイト単位)",
        "pageinfo-article-id": "ページ ID",
        "pageinfo-language": "ページ本文の言語",
+       "pageinfo-language-change": "変更",
        "pageinfo-content-model": "ページのコンテンツ モデル",
        "pageinfo-content-model-change": "設定変更",
        "pageinfo-robot-policy": "ロボットによるインデックス作成",
        "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|時間}}",
        "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": "アカウントの作成は、認証プラグインによって拒否されました。",
index aedb811..89c777e 100644 (file)
        "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",
        "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.",
        "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",
        "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",
        "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",
        "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-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-thanks": "Nuwun! Lebon saran Sampéyan wis dipasang nèng kacané \"[$2 $1]\".",
        "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 3a6eec5..9fde977 100644 (file)
@@ -27,7 +27,8 @@
                        "Gi777ga",
                        "Matma Rex",
                        "Sopopruidze",
-                       "Dixtosa"
+                       "Dixtosa",
+                       "OpusDEI"
                ]
        },
        "tog-underline": "ბმულების ხაზგასმა:",
@@ -72,7 +73,7 @@
        "tog-showhiddencats": "დამალული კატეგორიების ჩვენება",
        "tog-norollbackdiff": "ცვლილების გაუქმებისას არ მანახო ცვლილებათა განსხვავება",
        "tog-useeditwarning": "გამაფრთხილე, როდესაც დავტოვებ რედაქტირებად გვერდს, დაუმახსოვრებელი ცვლილებებით",
-       "tog-prefershttps": "á\83£á\83¡á\83\90á\83¤á\83 á\83\97á\83®á\83\9d á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\98á\83¡ á\83\9bá\83£á\83\93á\83\90á\83\9b გამოყენება ავტორიზაციის შემდეგ",
+       "tog-prefershttps": "á\83\9bá\83£á\83\93á\83\90á\83\9b á\83£á\83¡á\83\90á\83¤á\83 á\83\97á\83®á\83\9d á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\98á\83¡ გამოყენება ავტორიზაციის შემდეგ",
        "underline-always": "მუდამ",
        "underline-never": "არასდროს",
        "underline-default": "დამოკიდებული მომხმარებელზე ან ბრაუზერის არჩევანზე",
        "category-file-count-limited": "შემდეგი {{PLURAL:$1|ფაილი|$1 ფაილები}} ამ კატეგორიაშია.",
        "listingcontinuesabbrev": "გაგრძ.",
        "index-category": "გვერდების ინდექსაცია",
-       "noindex-category": "არ არსებობს ინდექსირებული გვერდები",
+       "noindex-category": "არინდექსირებული გვერდები",
        "broken-file-category": "გვერდები ფაილების არასწორი ბმულებით",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "category-header-numerals": "$1–$2",
        "newwindow": "(ახალ ფანჯარაში)",
        "cancel": "გაუქმება",
        "moredotdotdot": "ვრცლად...",
-       "morenotlisted": "á\83\94á\83¡ á\83\90á\83 á\83\90á\83¡á\83 á\83£á\83\9aá\83\98 á\83¡á\83\98á\83\90á\83\90.",
+       "morenotlisted": "á\83\94á\83¡ á\83¡á\83\98á\83\90 á\83¨á\83\94á\83\98á\83«á\83\9aá\83\94á\83\91á\83\90 á\83\98á\83§á\83\9dá\83¡ á\83\90á\83 á\83\90á\83¡á\83 á\83£á\83\9aá\83\98.",
        "mypage": "გვერდი",
        "mytalk": "განხილვა",
        "anontalk": "განხილვა",
        "searcharticle": "გვერდი",
        "history": "გვერდის ისტორია",
        "history_short": "ისტორია",
+       "history_small": "ისტორია",
        "updatedmarker": "განახლდა ჩემი ბოლო შემოსვლის შემდეგ",
        "printableversion": "დასაბეჭდი ვერსია",
        "permalink": "მუდმივი ბმული",
        "viewyourtext": "თქვენ შეგიძლიათ იხილოთ და დააკოპიროთ  <strong>თქვენი რედაქტირებების</strong> საწყისი ტექსტი ამ გვერდზე:",
        "protectedinterface": "ეს გვერდი წარმოადგენს ტექსტურ ინტერფეისს პროგრამული უზრუნველყოფისათვის და დაცულია ვანდალიზმის აღკვეთის მიზნით.",
        "editinginterface": "'''ყურადღება:''' თქვენ არედაქტირებთ გვერდს, რომელიც პროგრამის ინტერფეისის ტექსტს შეიცავს. \nამ გვერდზე განხორციელებული რედაქტირება გამოიწვევს ამ ვიკის სხვა მომხმარებელთა სამუშაო ინტერფეისის შეცვლასაც. \nიმისათვის, რომ დაამატოთ ან შეცვალოთ თარგმანები ყველა ვიკიში, გთხოვთ, გამოიყენოთ მედიავიკის ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
-       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკებისლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
+       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკების ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "ეს გვერდი რედაქტირებისგან დაცულია, რადგან იგი ჩართულია შემდეგ {{PLURAL:$1|გვერდში, რომლის|გვერდებში, რომელთა}} დასაცავადაც ჩართულია პარამეტრი \"იერარქიული\":\n$2",
        "namespaceprotected": "თქვენ არ გაქვთ '''$1''' სახელთა სივრცეში გვერდების რედაქტირების უფლება.",
        "customcssprotected": "თქვენ არ გაქვთ ამ CSS გვერდის რედაქტირების უფლება, ვინაიდან ის სხვა მომხმარებლის პირად კონფიგურაციას შეიცავს.",
        "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": "მაგალითი",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (იხ. აგრეთვე [[Special:NewPages|ახალი გვერდების სია]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "ჩვენება",
+       "rcfilters-highlightmenu-title": "ფერის არჩევა",
        "rcnotefrom": "ქვემოთ {{PLURAL:$5|ნაჩვენებია ცვლილება|ნაჩვენებია ცვლილებები}} <strong>$3, $4</strong>-დან (ნაჩვენებია არაუმეტეს <strong>$1</strong>).",
        "rclistfrom": "ახალი ცვლილებების ჩვენება დაწყებული $3 $2-დან",
        "rcshowhideminor": "მცირე რედაქტირების $1",
        "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ჯავა-ფაილების ატვირთვა დაუშვებელია, ვინაიდან მათ შესაძლოა შეზღუდონ უსაფრთხოება.",
        "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|საათი|საათი}}",
index 5ff8194..2f4c06a 100644 (file)
        "saveprefs": "محفوظ",
        "restoreprefs": "تمام بےنقص ترتیباتن بحال کورے",
        "prefs-editing": "تدوین",
-       "rows": "صف:",
-       "columns": "قطار:",
        "searchresultshead": "Search/تلاش",
        "stub-threshold-disabled": "غیر فعال",
        "timezonelegend": "وختو زون",
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 f7ad3d9..5829ad7 100644 (file)
        "saveprefs": "Сақтау",
        "restoreprefs": "Барлығын бастапқы баптауларға қайтару (барлық бөлімдердегі)",
        "prefs-editing": "Өңдеу",
-       "rows": "Жолдар:",
-       "columns": "Бағандар:",
        "searchresultshead": "Іздеу",
        "stub-threshold": "Бастама сілтемесін пішімдеу табалдырығы ($1):",
        "stub-threshold-sample-link": "қарапайым",
        "uploaddisabledtext": "Файл жүктеу өшірілген.",
        "php-uploaddisabledtext": "PHP-де файл жүктеулері өшірілген.\nfile_uploads баптауын тексеріңіз.",
        "uploadscripted": "Бұл файлда веб шолғышты қателікпен талдатқызатын HTML не әмір коды бар.",
-       "uploadscriptednamespace": "Бұл SVG файл дұрыс емес «$1» есім кеңістігінен тұрады.",
+       "uploadscriptednamespace": "Бұл SVG файл дұрыс емес «<nowiki>$1</nowiki>» есім кеңістігінен тұрады.",
        "uploadinvalidxml": "Жүктелген файлдағы XML талданбайды.",
        "uploadvirus": "Бұл файлда вирус бар! Егжей-тегжейлері: $1",
        "uploadjava": "ZIP файл  Java . түріндегі файлдан тұрады.\nJava файлдарды жүктеу рұқсат етілмейді, себебі құпиялық шектеулерге айналуына себеп болады.",
        "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 89564eb..2b3ef5a 100644 (file)
@@ -16,7 +16,8 @@
                        "វ័ណថារិទ្ធ",
                        "아라",
                        "Macofe",
-                       "Dcljr"
+                       "Dcljr",
+                       "Aefgh39622"
                ]
        },
        "tog-underline": "គូសបន្ទាត់ក្រោម​តំណភ្ជាប់៖",
@@ -43,7 +44,7 @@
        "tog-enotifminoredits": "ផ្ញើអ៊ីមែល​មកខ្ញុំពេលមានបន្លាស់ប្ដូរតិចតួច​លើទំព័រឬឯកសារផងដែរ​",
        "tog-enotifrevealaddr": "បង្ហាញ​អាសយដ្ឋានអ៊ីមែល​របស់ខ្ញុំ​ក្នុង​​អ៊ីមែល​ក្រើនរំលឹក​",
        "tog-shownumberswatching": "បង្ហាញ​ចំនួនអ្នកប្រើប្រាស់​ដែលតាមដាន​ទំព័រនេះ",
-       "tog-oldsig": "ហត្ថលេខាមានហើយ៖",
+       "tog-oldsig": "á\9e á\9e\8fá\9f\92á\9e\90á\9e\9bá\9f\81á\9e\81á\9e¶á\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e¶á\9e\93á\9e á\9e¾á\9e\99á\9f\96",
        "tog-fancysig": "ចុះហត្ថលេខា​ជា​អត្ថបទវិគី​ (ដោយ​គ្មានតំណភ្ជាប់​ស្វ័យប្រវត្តិ)",
        "tog-uselivepreview": "ប្រើប្រាស់​ការមើលមុនរហ័ស",
        "tog-forceeditsummary": "សូមរំលឹកខ្ញុំ​កាលបើខ្ញុំទុកប្រអប់ចំណារពន្យល់ឱ្យនៅទំនេរ",
@@ -59,7 +60,7 @@
        "tog-showhiddencats": "បង្ហាញចំណាត់ថ្នាក់ក្រុមដែលត្រូវបានលាក់",
        "tog-norollbackdiff": "បំភ្លេច​ភាព​ខុស​គ្នា​បន្ទាប់​ពី​អនុវត្តការ​ស្ដារវិញ",
        "tog-useeditwarning": "សូមព្រមាន​ខ្ញុំ​ ពេលដែលខ្ញុំ​ចាកចេញ​ពី​ទំព័រ​កែប្រែដោយមិន​បានរក្សា​ទុកបន្លាស់ប្ដូរ​នានា​",
-       "tog-prefershttps": "ប្រើប្រាស់ការតភ្ជាប់មានសុវត្ថិភាពជានិច្ចពេលកត់ឈ្មោះចូល",
+       "tog-prefershttps": "á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\80á\9e¶á\9e\9aá\9e\8fá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\9fá\9e»á\9e\9cá\9e\8fá\9f\92á\9e\90á\9e·á\9e\97á\9e¶á\9e\96á\9e\87á\9e¶á\9e\93á\9e·á\9e\85á\9f\92á\9e\85á\9e\96á\9f\81á\9e\9bá\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9b",
        "underline-always": "ជានិច្ច",
        "underline-never": "កុំឲ្យសោះ",
        "underline-default": "តាមលំនាំដើមនៃ​កម្មវិធី​រុករក​",
        "morenotlisted": "បញ្ជីនេះមិនទាន់ពេញលេញទេ។",
        "mypage": "ទំព័រ​",
        "mytalk": "ការពិភាក្សា​",
-       "anontalk": "á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶á\9e\9fá\9f\86á\9e\9aá\9e¶á\9e\94á\9f\8b IP á\9e\93á\9f\81á\9f\87",
+       "anontalk": "á\9e\80á\9e¶á\9e\9aâ\80\8bá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e",
        "navigation": "ការណែនាំ",
        "and": "&#32;និង",
        "qbfind": "ស្វែងរក",
        "nocookieslogin": "{{SITENAME}}ប្រើខូឃីដើម្បីកត់ឈ្មោះចូល។\n\nអ្នកបានជ្រើសមិនប្រើខូឃី។​\n\nសូមជ្រើសប្រើខូឃីវិញ រួចព្យាយាមម្តងទៀត។",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "អ្នកមិនបានផ្ដល់អត្តនាមត្រឹមត្រូវទេ។",
-       "loginsuccesstitle": "á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92á\9e\9aá\9f\81á\9e\85",
+       "loginsuccesstitle": "á\9e\94á\9e¶á\9e\93á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e á\9e¾á\9e\99",
        "loginsuccess": "'''ពេលនេះអ្នកបានកត់ឈ្មោះចូល{{SITENAME}}ដោយប្រើឈ្មោះ \"$1\"ហើយ។'''",
        "nosuchuser": "មិនមានអ្នកប្រើដែលមានឈ្មោះ \"$1\" ទេ។\n\nសូម​ពិនិត្យ​ក្រែង​លោ​មានកំហុស​អក្ខរាវិរុទ្ធឬ [[Special:CreateAccount|បង្កើត​គណនី​ថ្មី]]។",
        "nosuchusershort": "គ្មានអ្នកប្រើដែលមានឈ្មោះ $1\" ទេ។\n\nសូម​ពិនិត្យ​​អក្ខរាវិរុទ្ធ​របស់អ្នក ។",
        "newpassword": "ពាក្យសម្ងាត់ថ្មី៖",
        "retypenew": "សូមវាយពាក្យសម្ងាត់ថ្មី​ម្តងទៀត៖",
        "resetpass_submit": "ដាក់ប្រើពាក្យសម្ងាត់និង​កត់ឈ្មោះចូល",
-       "changepassword-success": "á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\94á\9e¶á\9e\93á\9e\9fá\9f\86á\9e\9aá\9f\81á\9e\85á\9e á\9e¾á\9e\99!",
+       "changepassword-success": "ពាក្យសម្ងាត់របស់អ្នកត្រូវបានផ្លាស់ប្តូរហើយ!",
        "changepassword-throttled": "អ្នកបានព្យាយាមកត់ឈ្មោះចូលជាប់ៗគ្នាច្រើនដងពេកហើយ។​\nសូមរង់ចាំរយៈពេល$1 មុនពេលសាកល្បងម្ដងទៀត។",
        "resetpass_forbidden": "ពាក្យសម្ងាត់មិនអាចផ្លាស់ប្តូរបានទេ",
        "resetpass-no-info": "អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។",
        "passwordreset-emaildisabled": "មុខងារអ៊ីមែលត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។",
        "passwordreset-username": "អត្តនាម៖",
        "passwordreset-domain": "ដូម៉ែន៖",
-       "passwordreset-capture": "មើលអ៊ីមែលលទ្ធផល?",
-       "passwordreset-capture-help": "ប្រសិនបើអ្នកគូសធីកប្រអប់នេះ អ៊ីមែល (ដែលមានពាក្យសម្ងាត់បណ្ដោះអាសន្ន) មិនត្រូវបានបង្ហាញដូចគ្នានឹងអ៊ីមែលដែលនឹងត្រូវផ្ញើទៅទៅកាន់អ្នកប្រើប្រាស់ដែរ។",
        "passwordreset-email": "អាសយដ្ឋានអ៊ីមែល៖",
        "passwordreset-emailtitle": "ព័ត៌មានលំអិតពីគណនីនៅលើ {{SITENAME}}",
        "passwordreset-emailtext-ip": "មាននរណាម្នាក់ (ប្រហែលជាខ្លួនអ្នកផ្ទាល់, មកពីអាស័យដ្ឋាន IP $1) បានស្នើសុំស្ដារពាក្យសម្ងាត់របស់អ្នកសម្រាប់ {{SITENAME}} ($4)។ {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះ\nមានជាប់ទាក់ទិននឹងអាសយដ្ឋានអ៊ីមែលនេះ៖\n\n$2\n\n{{PLURAL:$3|ពាក្យសម្ងាត់បណ្ដោះអាសន្ននេះ|ពាក្យសម្ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។\nយកល្អអ្នកគួរតែកត់ឈ្មោះចូលរួចជ្រើសរើសពាក្យសម្ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ \nឬប្រសិនបើអ្នកនឹកឃើញពាក្យសម្ងាត់ដើមរបស់អ្នក ហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ\nបំភ្លេចអំពីសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកទៅបានហើយ។",
        "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": "មើលអ៊ីមែលសំរាប់កំណត់ពាក្យសម្ងាត់ឡើងវិញ",
        "newuserlogpage": "កំណត់ហេតុនៃការបង្កើតគណនី",
        "newuserlogpagetext": "នេះជាកំណត់ហេតុនៃការបង្កើតអ្នកប្រើប្រាស់។",
        "rightslog": "កំណត់ហេតុនៃការប្តូរសិទ្ធិអ្នកប្រើប្រាស់",
        "rightslogtext": "នេះ​ជា​កំណត់ហេតុនៃបំលាស់ប្ដូរចំពោះកាប្ដូរក្រុមសមាជិកភាព​របស់​អ្នកប្រើប្រាស់។",
        "action-read": "អានទំព័រនេះ",
        "action-edit": "កែប្រែទំព័រនេះ",
-       "action-createpage": "á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9e¶á\9e\93á\9e",
-       "action-createtalk": "á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶á\9e\93á\9e¶á\9e\93á\9e",
+       "action-createpage": "á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87",
+       "action-createtalk": "á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶á\9e\93á\9f\81á\9f\87",
        "action-createaccount": "បង្កើតគណនីអ្នកប្រើប្រាស់នេះ",
        "action-history": "មើលប្រវត្តិទំព័រនេះ",
        "action-minoredit": "ចំណាំកំណែប្រែនេះថាជាកំណែប្រែតិចតួច",
        "feedback-thanks-title": "សូមអរគុណ!",
        "searchsuggest-search": "ស្វែងរក​",
        "searchsuggest-containing": "ដែលមានពាក្យ...",
-       "api-error-badaccess-groups": "អ្នកគ្មានការអនុញ្ញាតអោយផ្ទុកឯកសារឡើងទៅក្នុងវិគីនេះទេ។",
-       "api-error-empty-file": "ឯកសារដែលអ្នកបានដាក់ស្នើគឺទទេ។",
        "api-error-emptypage": "ការអនុញ្ញាតអោយបង្កើតទំព័រថ្មីដែលគ្មានសរសេរអ្វីទេ",
-       "api-error-fileexists-forbidden": "ឯកសារដែលមានឈ្មោះ \"$1\" មានរួចហើយ ហើយមិនអាចសរសេរជាន់ពីលើបានទេ។",
-       "api-error-fileexists-shared-forbidden": "ឯកសារដែលមានឈ្មោះ \"$1\" មានរួចហើយនៅក្នុងថតឯកសាររួម ហើយមិនអាចសរសេរជាន់ពីលើបានទេ។",
-       "api-error-file-too-large": "ឯកសារដែលអ្នកបានដាក់ស្នើធំពេកហើយ។",
-       "api-error-filename-tooshort": "ឈ្មោះឯកសារខ្លីពេកហើយ។",
-       "api-error-filetype-banned": "ឯកសារប្រភេទនេះត្រូវបានហាមប្រាម។",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|មិនមែនជា​ប្រភេទ​ឯកសារ​ដែល​ត្រូវ​បាន​គេ​អនុញ្ញាត​ទេ|មិនមែនជា​ប្រភេទ​ឯកសារ​ដែល​ត្រូវ​បាន​គេ​អនុញ្ញាត​ទេ​}}។\n{{PLURAL:$3|ប្រភេទឯកសារ​|ប្រភេទឯកសារ​}}ដែល​ត្រូវ​បាន​គេ​អនុញ្ញាត​គឺ $2 ។",
-       "api-error-filetype-missing": "ឈ្មោះឯកសារបាត់កន្ទុយ។",
-       "api-error-http": "បញ្ហាខាងក្នុង៖ មិនអាចភ្ជាប់ទោកាន់ម៉ាស៊ីនបំរើការ។",
-       "api-error-illegal-filename": "មិនអនុញ្ញាតអោយប្រើឈ្មោះឯកសារនេះ។",
-       "api-error-internal-error": "បញ្ហាខាងក្នុង៖ មានបញ្ហាណាមួយកើតឡើងពេលកំពុងដំណើរការផ្ទុកឯកសារអ្នកឡើងទៅក្នុងវិគី។",
-       "api-error-missingresult": "បញ្ហាខាងក្នុង៖ មិនអាចកំណត់បានថាការថតចំលងបានសំរេចទេ។",
-       "api-error-mustbeloggedin": "អ្នកត្រូវតែកត់ឈ្មោះចូលដើម្បីផ្ទុកឯកសារឡើង។",
-       "api-error-ok-but-empty": "បញ្ហាខាងក្នុង៖ គ្មានចម្លើយពីម៉ាស៊ីនបម្រើការ។",
-       "api-error-overwrite": "មិនអនុញ្ញាតអោយសរសេរជាន់ពីលើឯកសារដែលមានស្រាប់ហើយ។",
-       "api-error-timeout": "ម៉ាស៊ីនបំរើការមិនបានឆ្លើយតបក្នុងរយៈពេលដែលយើងរំពឹងទុក។",
-       "api-error-unclassified": "បញ្ហាមិនស្គាល់មួយបានកើតឡើង។",
-       "api-error-unknown-code": "បញ្ហាមិនស្គាល់៖ \"$1\" ។",
-       "api-error-unknown-error": "បញ្ហាខាងក្នុង៖ មានបញ្ហាមិនស្រួលពេលកំពុងព្យាយាមផ្ទុកឯកសាររបស់អ្នកឡើង។",
        "api-error-unknown-warning": "ការព្រមានមិនស្គាល់៖ \"$1 ។",
        "api-error-unknownerror": "បញ្ហាមិនស្គាល់៖ \"$1\" ។",
-       "api-error-uploaddisabled": "ការផ្ទុកឡើងត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះទេ។",
-       "api-error-verification-error": "ឯកសារនេះប្រហែលជាខូច ឯមានកន្ទុយមិនត្រឹមត្រូវ។",
        "duration-seconds": "$1 {{PLURAL:$1|វិនាទី|វិនាទី}}",
        "duration-minutes": "$1 {{PLURAL:$1|នាទី|នាទី}}",
        "duration-hours": "$1 {{PLURAL:$1|ម៉ោង|ម៉ោង}}",
index e4db54c..8660847 100644 (file)
@@ -64,7 +64,8 @@
                        "Ykhwong",
                        "Matma Rex",
                        "Tursetic",
-                       "Jerrykim306"
+                       "Jerrykim306",
+                       "Sukjong0406"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "searcharticle": "보기",
        "history": "문서 역사",
        "history_short": "역사",
+       "history_small": "역사",
        "updatedmarker": "마지막으로 방문한 뒤 바뀜",
        "printableversion": "인쇄용 판",
        "permalink": "고유 링크",
        "botpasswords-updated-body": "사용자 \"$2\"의 \"$1\"라는 이름의 봇 비밀번호가 업데이트되었습니다.",
        "botpasswords-deleted-title": "봇 비밀번호 제거",
        "botpasswords-deleted-body": "사용자 \"$2\"의 \"$1\"라는 이름의 봇 비밀번호가 삭제되었습니다.",
-       "botpasswords-newpassword": "<strong>$1</strong>님으로 로그인하기 위한 새 비밀번호가 <strong>$2</strong>입니다. <em>잊어버리지 않도록 기록해두시기 바랍니다.</em><br> (오래된의 봇의 최근 사용자의 로그인이 필요한 경우, <strong>$3</strong>을(를) 계정이름으로, <strong>$4</strong>을(를) 암호로 사용하실수 있습니다.)",
+       "botpasswords-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\")를 포함하고 있지 않습니다.",
        "selfredirect": "<strong>경고:</strong> 자기 자신으로 문서를 넘겨주고 있습니다.\n넘겨줄 대상을 잘못 입력했거나, 잘못된 문서를 편집하고 있을 수 있습니다.\n\"{{int:savearticle}}\"을 입력하면, 넘겨주기 문서가 생성될 것입니다.",
        "missingcommenttext": "아래에 내용을 채워 넣어 주세요.",
        "missingcommentheader": "<strong>알림:</strong> 글의 제목을 입력하지 않았습니다.\n다시 \"{{int:savearticle}}\" 버튼을 클릭하면 글이 제목 없이 저장됩니다.",
-       "summary-preview": "요약 미리 보기:",
+       "summary-preview": "편집 요약 미리 보기:",
        "subject-preview": "주제 미리 보기:",
        "previewerrortext": "변경사항을 미리보기하는 도중 오류가 발생했습니다.",
        "blockedtitle": "사용자가 차단됨",
        "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": "언어:",
        "userrights-user-editname": "사용자 이름 입력:",
        "editusergroup": "사용자 그룹 불러오기",
        "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|사용자}}의 권한 바꾸기",
-       "viewinguserrights": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|사용자}}의 권한 보는 중",
-       "userrights-editusergroup": "사용자 그룹 편집",
-       "userrights-viewusergroup": "사용자 그룹 보기",
+       "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-nodatabase": "데이터베이스 $1이 존재하지 않거나 로컬에 있지 않습니다.",
        "userrights-changeable-col": "바꿀 수 있는 권한",
        "userrights-unchangeable-col": "바꿀 수 없는 권한",
+       "userrights-expiry-current": "$1에 만료",
+       "userrights-expiry-none": "만료하지 않음",
+       "userrights-expiry": "기한:",
+       "userrights-expiry-existing": "현재 만료 시간: $2 $3",
+       "userrights-expiry-othertime": "다른 시간:",
+       "userrights-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": "사용자",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|새 문서 목록]]도 보세요)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "보기",
-       "rcfilters-invalid-filter": "비유효한 필터",
+       "rcfilters-activefilters": "사용 중인 필터",
+       "rcfilters-restore-default-filters": "기본 필터 복구",
+       "rcfilters-clear-all-filters": "필터 모두 지우기",
+       "rcfilters-search-placeholder": "필터 최근 바뀜 (찾아보거나 입력을 시작하십시오)",
+       "rcfilters-invalid-filter": "유효하지 않은 필터",
+       "rcfilters-empty-filter": "활성화된 필터가 없습니다. 모든 기여가 표시됩니다.",
        "rcfilters-filterlist-title": "필터",
+       "rcfilters-filterlist-feedbacklink": "새로운 (베타) 필터에 대한 의견을 주세요",
+       "rcfilters-highlightbutton-title": "결과 강조",
+       "rcfilters-highlightmenu-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-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": "분류에서 추가되거나 제거되는 페이지의 기록.",
+       "rcfilters-filter-logactions-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보안 규제를 우회할 수 있기 때문에 자바 파일을 올리는 것이 허용되지 않습니다.",
        "uncategorizedcategories": "분류되지 않은 분류 목록",
        "uncategorizedimages": "분류되지 않은 파일 목록",
        "uncategorizedtemplates": "분류되지 않은 틀 목록",
+       "uncategorized-categories-exceptionlist": "# \"특수:분류안된분류\"에 언급되지 않은 분류의 목록을 포함합니다. 한 줄에 하나씩 \"*\"로 시작합니다. 다른 문자(공백 포함)로 시작하는 줄들은 무시됩니다. 주석의 경우 \"#\"를 사용하십시오.",
        "unusedcategories": "사용하지 않는 분류 목록",
        "unusedimages": "사용하지 않는 파일 목록",
        "wantedcategories": "필요한 분류 목록",
        "apisandbox-sending-request": "API 요청을 보내는 중...",
        "apisandbox-loading-results": "API 결과를 받는 중...",
        "apisandbox-results-error": "API 질의 응답을 불러오는 도중 오류 발생: $1.",
-       "apisandbox-request-params-json": "JSON 변수:",
+       "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-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 (모든 값)",
        "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}}\" 기능을 통해 보냈습니다. 이 이메일에 답장을 보내게 되면 원래 이메일을 보낸 사용자에게 직접 답장을 보내게 되며, 따라서 귀하의 이메일 주소를 보낸 사용자에게 공개하게 됩니다.",
        "usermessage-summary": "시스템 메시지 남기기",
        "usermessage-editor": "시스템 메신저",
        "usermessage-template": "MediaWiki:UserMessage",
        "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브라우저의 뒤로 버튼을 누르고 문서를 새로 고침한 후에 다시 시도해 주세요.",
        "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": "자신이 차단되어 있기 때문에 다른 사용자를 차단하거나 차단을 해제할 수 없습니다.",
        "imagenocrossnamespace": "파일을 파일이 아닌 이름공간으로 이동할 수 없습니다.",
        "nonfile-cannot-move-to-file": "파일이 아닌 문서를 파일 이름공간으로 이동할 수 없습니다.",
        "imagetypemismatch": "새 파일의 확장자가 원래의 확장자와 일치하지 않습니다.",
-       "imageinvalidfilename": " 파일 이름이 잘못되었습니다.",
+       "imageinvalidfilename": "대상 파일 이름이 잘못되었습니다.",
        "fix-double-redirects": "원래 제목을 가리키는 넘겨주기를 새로 고침",
        "move-leave-redirect": "이동한 뒤 넘겨주기를 남기기",
        "protectedpagemovewarning": "<strong>경고:</strong> 이 문서는 관리자만 이동할 수 있도록 보호되어 있습니다.\n최근 기록을 참조를 위해 아래에 제공합니다:",
        "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-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 문서는 존재하지 않습니다.",
        "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-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-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-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": "쿠키 기반 세션",
        "usercssispublic": "주목해 주십시오: CSS의 하위 문서들은 다른 사용자들이 볼 수 있기 때문에 기밀 데이터를 포함해서는 안 됩니다.",
        "restrictionsfield-badip": "유효하지 않은 IP 주소나 대역: $1",
        "restrictionsfield-label": "허용된 IP 대역:",
-       "restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "$1 판",
        "pageid": "페이지 ID $1"
 }
index 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 ff6e09a..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",
+       "editing": "\"$1\" tê guherandin",
        "creating": "\"$1\" tê çêkirin",
-       "editingsection": "Tê guherandin: $1 (beş)",
-       "editingcomment": "$1 (beşek nû) tê guherandin.",
+       "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",
        "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.",
        "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 5fe5262..32af23f 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",
        "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",
        "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:",
        "userrights-user-editname": "Benotzernumm uginn:",
        "editusergroup": "Benotzergruppe lueden",
        "editinguser": "Ännere vun de Rechter vum  {{GENDER:$1|Benotzer}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Benotzergruppen änneren",
-       "userrights-viewusergroup": "Benotzergruppe weisen",
+       "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-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.",
        "group": "Grupp:",
        "group-user": "Benotzer",
        "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-highlightmenu-title": "Eng Faarf eraussichen",
+       "rcfilters-filterlist-noresults": "Keng Filtere fonnt",
+       "rcfilters-filter-editsbyself-label": "Är eegen Ännerungen",
+       "rcfilters-filter-editsbyself-description": "Ännerunge vun Iech.",
+       "rcfilters-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",
        "upload-scripted-pi-callback": "Et ass net méiglech XML-Fichieren eropzelueden an deenen XML-Stylesheet Instruktioune fir d'Verschaffen drastinn",
        "uploaded-hostile-svg": "Net sécheren CSS am Stilelement vum eropgeluedene SVG-Fichier fonnt.",
        "uploaded-image-filter-svg": "Bildfilter mat der URL: <code>&lt;$1 $2=\"$3\"&gt;</code> am eropgeluedenen SVG-Fichier fonnt.",
-       "uploadscriptednamespace": "An dësem SVG-Fichier ass en illegalen Nummraum \"$1\"",
+       "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-results": "Resultater",
        "apisandbox-sending-request": "Schécke vun der API-Ufro...",
        "apisandbox-loading-results": "Ofruffe vun den API-Resultater...",
-       "apisandbox-request-params-json": "JSON-Parameteren:",
        "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.",
        "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. {{GENDER:$2|Är}} E-Mail gëtt direkt un den {{GENDER:$1|originalen Absender}} geschéckt do bäi gesäit  {{GENDER:$1|deen}} {{GENDER:$2|Är}} E-Mail-Adress.",
+       "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",
        "editcomment": "De Resumé vun der Ännerung war: <em>$1</em>.",
        "revertpage": "Ännerunge vum [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussioun]]) zréckgesat op déi lescht Versioun vum [[User:$1|$1]]",
        "revertpage-nouser": "Zréckgesaten Ännerungen duerch e verstoppte Benotzer op déi lescht Versioun vum {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "D'Ännerunge vum $1 goufen zréckgesat op déi lescht Versioun vum $2.",
+       "rollback-success": "D'Ännerunge vum {{GENDER:$3|$1}} goufen zréckgesat op déi lescht Versioun vum {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Zréckgesat Ännerunge vum $1:\nzréckgeännert op déi lescht Versioun vum $2. [$3 Ännerunge weisen]",
        "sessionfailure-title": "Setzungsfeeler",
        "sessionfailure": "Et schéngt e Problem mat Ärer Loginseance ze ginn;\nDës Aktioun gouf aus Sécherheetsgrënn ofgebrach, fir ze verhënneren datt Är Seance piratéiert ka ginn.\nKlickt w.e.g. op \"Zréck\" a luet déi Säit vun där Dir komm sidd nei, a versicht et dann nach eng Kéier.",
        "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",
        "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|een anere Fichier|e puer aner Fichiere}} mam selwechten Inhalt um Site",
-       "api-error-duplicate-archive": "Et gouf schonn {{PLURAL:$1|een anere Fichier|e puer aner Fichieren}} um Site mam selwechten 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-stashnosuchfilekey": "De Schlëssel vum Fichier op deen Dir am Späicher zréckgräife wëllt gëtt et net.",
-       "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-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",
        "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.",
index 90e5058..3bf5384 100644 (file)
        "saveprefs": "Хуьн",
        "restoreprefs": "Авайл хьиз кьунвай низамарунар туькIуьр хъувун",
        "prefs-editing": "Дуьзар хъувун",
-       "rows": "ЦIарар",
-       "columns": "Гулар:",
        "searchresultshead": "Ахтармишун",
        "stub-threshold-disabled": "Галуднава",
        "timezonelegend": "Вахтунин минзил",
        "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": "Гьич авун",
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 54bd07e..06998ae 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",
        "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]].",
        "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",
        "userrights-user-editname": "Scrivi o teu nomme utente:",
        "editusergroup": "Carrega groppi utente",
        "editinguser": "Apreuvo a cangiâ i driti de l'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Vixualizaçion di driti de l'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Modiffica i gruppi di utenti",
+       "userrights-viewusergroup": "Vixualizza groppi utente",
        "saveusergroups": "Sarva groppi {{GENDER:$1|utente}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro impliçito de:",
        "userrights-nodatabase": "O database $1 o no l'esiste ò o no l'è un database locale.",
        "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.",
        "group": "Gruppo:",
        "group-user": "Ûtenti",
        "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.",
        "wantedfiletext-nocat-noforeign": "I seguenti file son in doeuvia, ma no existan.",
        "wantedtemplates": "Template domandæ",
        "mostlinked": "Paggine ciû collegæ",
-       "mostlinkedcategories": "Categorîe ciû collegæ",
+       "mostlinkedcategories": "Categorie ciu conligæ",
        "mostlinkedtemplates": "Paggine ciu incluse",
        "mostcategories": "Voxe con ciû categorîe",
        "mostimages": "Immaggini con ciû collegamenti",
        "protectedtitles-summary": "Questa pagina a l'elenca i titoli che son attualmente protetti da-a creaçion. Pe 'n elenco de pagine existente che son protette, amia [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Tittoli protezui con sti parammetri pe-o momento no ghe n'è.",
        "protectedtitles-submit": "Mostra tittoli",
-       "listusers": "Lista dtenti",
+       "listusers": "Lista di utenti",
        "listusers-editsonly": "Mostra solo i utenti con di contributi",
        "listusers-creationsort": "Ordina pe dæta de creaçion",
        "listusers-desc": "Ordina in senso decrescente",
        "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}}",
index b0e88f5..453060c 100644 (file)
        "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š",
        "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ā",
        "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",
        "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",
        "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",
        "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:",
        "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)",
        "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-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-n-mainpage-description": "Li eḑīz līed pǟlõ",
        "tooltip-n-portal": "Iļ projekt, midā tīedõ sōd, kui um ažḑi lieudõmist",
        "tooltip-n-currentevents": "Līeda tieutõkst iļ paldīž suggõbõd ažād",
-       "tooltip-n-recentchanges": "Vikipēdijs tīedõd perrizt mõitõkst nimkēra",
+       "tooltip-n-recentchanges": "Vikipēdijs tīedõd perrizt mȭitõkst nimkēra",
        "tooltip-n-randompage": "Li bäz tīedõmõt tulbõ līed pǟlõ",
        "tooltip-n-help": "Kūož laz lieudõg ilzõ",
        "tooltip-t-whatlinkshere": "Amād vikipēdij lēḑõd, kust um tǟnõ siḑīmḑi",
        "tooltip-ca-nstab-template": "Nägţ mallõ",
        "tooltip-ca-nstab-category": "Nägţ kategōrij līedtõ",
        "tooltip-minoredit": "Pangid tǟnõ merk ku se um ikš piški parāmtimi",
-       "tooltip-save": "Sa-gläbb mõitõkst",
-       "tooltip-preview": "Nägţ tīedõd mõitõkši. Pōlaks kȭlbatigid siedā jedmõl sa-gläbbõmizt!",
-       "tooltip-diff": "Nägţ tīedõd mõitõkši.",
+       "tooltip-save": "Sa-glōib mȭitõkst",
+       "tooltip-preview": "Nägţ tīedõd mȭitõkši. Pōlaks kȭlbatigid siedā jedmõl sa-glōibimizt!",
+       "tooltip-diff": "Nägţ tīedõd mȭitõkši.",
        "tooltip-compareselectedversions": "Nägţ vaiţidi kōd sīe līed vēļdõt versijõ vail",
        "tooltip-watch": "Pan jūrõ se līedpūol eņtš iļ-vaņtlimiz nimkerrõ",
        "tooltip-rollback": "Kištāntõb jarā īd glõbžõks lǟndz kubsõtīe tējiz tīedõd mõitõkst",
        "tooltip-undo": "\"Viedāgid jarā\" tīeb tijāks/kīeldõbjarā sīe mõitõks ja ovātõb redigīerimiz läb tekstõ jedmõl-vaņtlimizõks. Neiīž tēg võigid sǟl kēratõ, mis vȯļ sīe jarā vīmiz sī.",
        "tooltip-summary": "Kēratigid lītõ kubbõ-võtāmi",
+       "pageinfo-toolboxlink": "Līed dattõd",
        "previousdiff": "← Jedmõli redaktsij",
        "nextdiff": "Jo ūd redigīerimizt",
        "file-info-size": " $1 × $2 piksõlt, bildā sūrit: $3, MIME tīp: $4",
index 369465c..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-emailelement": "نام کاربری: \n$1\n\nگذرواژهٔ موقت: \n$2",
        "passwordreset-emailsentemail": "اگر نشانی پست الکترونیکی که وارد کردید برای حساب کاربریتان ثبت شده باشد، یک نامهٔ بازنشانی گذرواژه به آن فرستاده می‌شود.",
        "passwordreset-emailsentusername": "اگر نشانی پست الکترونیکی مرتبطی موجود باشد، یک نامه برای بازنشانی گذرواژه به آن ارسال خواهد شد.",
+       "passwordreset-nocaller": "زنگ مجبور نییه به تأمین کردن",
+       "passwordreset-nosuchcaller": "زنگ موجود نییه: $1",
+       "passwordreset-invalidemail": "آدرس ایمیل نامعتبره",
        "changeemail": "تغییر یا حذف نشانی ایمیل",
        "changeemail-header": "برای تغییر ایمیلتان این فرم را کامل کنید. برای حذف ایملیتان کافی است بخش ایمیل را خالی رها کنید و فرم را ارسال کنید.",
        "changeemail-no-info": ".برای دسترسی مستقیم به این صفحه شما باید به سیستم وارد شده باشید",
        "minoredit": "یۀ دۀسکاری جزئیکۀ",
        "watchthis": "پئ گیری اێ وەلگە",
        "savearticle": "وەڵگە بِیل(ذخیره کە)",
+       "savechanges": "تغییراتی قید بکه",
+       "publishpage": "صفحهٔ انتشار",
+       "publishchanges": "تغییرات انتشار",
        "preview": "پیش‌نمایش",
        "showpreview": "پیش‌نمایش",
        "showdiff": "گؤەڕیال(تغییرات) بۆین",
        "invalid-content-data": "داده محتوای نامعتبر",
        "content-not-allowed-here": "محتوای «$1» در صفحهٔ [[$2]] مجاز نیست",
        "editwarning-warning": "خروج از این برگه ممکن است باعث شود که شما هر شانسی که به وجود آورده‌اید را از دست بدهید.\nاگر شما وارد سامانه شده‌اید، می‌توانید این هشدار را در بخش «{{int:prefs-editing}}» ترجیحاتتان غیرفعال کنید.",
+       "editpage-invalidcontentmodel-title": "مودل محتوا دستک نبینه",
+       "editpage-invalidcontentmodel-text": "مودل محتوا \"$1\" دستک نبینه",
        "editpage-notsupportedcontentformat-title": "فرمت نۆم جِک(محتوا)پشتیبانی نشده",
        "editpage-notsupportedcontentformat-text": "فرمت محتوای $1 توسط مدل محتوای $2 پشتیبانی نشده‌است.",
        "content-model-wikitext": "ویکی‌متن",
        "revdelete-unsuppress": "حذف محدودیت‌ها در بازبینی‌های ترمیم‌شده",
        "revdelete-log": ":دةلیل",
        "revdelete-submit": "اعمال بر {{PLURAL:$1|نسخهٔ|نسخه‌های}} انتخاب شده",
-       "revdelete-success": "'''پیدایی ورژن با موفقیت به روز شد.'''",
+       "revdelete-success": "نمایش رویزیون به‌روژ بوو",
        "revdelete-failure": "'''پیدایی ورژن ها قابل به روز کردن نیست:'''\n$1",
-       "logdelete-success": "تغییر پیدایی مورد با موفقیت انجام شد.",
+       "logdelete-success": "ورود نمایش ست",
        "logdelete-failure": "'''پیدایی سیاهه‌ها قابل تنظیم نیست:'''\n$1",
        "revdel-restore": "گؤەڕانن/تغییر پیدایی",
        "pagehist": "تاریخ وةڵگة",
        "mergehistory-empty": "هیچ‌یک از ورژن ها قابل ادغام نیستند.",
        "mergehistory-done": "$3 نسخه از $1 در {{PLURAL:$3|ادغام شد}}به [[:$2]].",
        "mergehistory-fail": "ادغام تاریخچه ممکن نیست، لطفاً گزینه‌های صفحه و زمان را بازبینی کنید.",
+       "mergehistory-fail-bad-timestamp": "برچسب زمانی معتبر نییه",
+       "mergehistory-fail-invalid-source": "صفحه منبع معتبر نییه",
+       "mergehistory-fail-invalid-dest": "صفحه مقصد معتبر نییه",
        "mergehistory-fail-toobig": "نمی‌توان ادغام تاریخچه را انجام داد که بیشتر از محدودیت $1 {{PLURAL:$1|نسخه}} انتقال داده خواهد شد.",
        "mergehistory-no-source": "صفحهٔ مبدأ $1 وجود ندارد.",
        "mergehistory-no-destination": "صفحهٔ مقصد $1 وجود ندارد.",
        "searchprofile-advanced-tooltip": "جستجو در فضاهای نام دلخواه",
        "search-result-size": "$1 ({{PLURAL:$2|1 واژۀ|$2 واژۀل}})",
        "search-result-category-size": "{{PLURAL:$1|یک عضو|$1 عضو}} ({{PLURAL:$2|یک زیررده|$2 زیررده}}، {{PLURAL:$3|یک پرونده|$3 پرونده}})",
-       "search-redirect": "(تغییرمسیر $1)",
+       "search-redirect": "(تغییرمسیر اژ $1)",
        "search-section": "(بۀخش $1)",
        "search-category": "(ڕِزگ $1)",
        "search-file-match": "(تشابه محتوی پرونده)",
        "saveprefs": "هیشتن(ذخیره)",
        "restoreprefs": "برگرداندن تمام تنظیمات پیش‌فرض (در تمامی قسمت‌ها)",
        "prefs-editing": "دەسکاری کردن",
-       "rows": "تعداد سطرها:",
-       "columns": "تعداد ستون‌ها:",
        "searchresultshead": "مِنِی کِردِن(گێردین)",
        "stub-threshold": "آستانهٔ ویرایش پیوندهای ناقص ($1):",
        "stub-threshold-sample-link": "نمونه",
        "prefswarning-warning": "تغییراتتان به ترجیحات هنوز ذحیره نشده است.\nاگر این صفحه بدون کلیک بر «$1» ترک کنید ترجیحاتتان ذخیره نخواهد شد.",
        "prefs-tabs-navigation-hint": "نکته: شما می توانید از کلیدهای جهت‌نمای چپ و راست برای حرکت بین زبانه‌ها در فهرست زبانه‌ها استفاده کنید.",
        "userrights": "مدیریت اختیارات کاربر",
-       "userrights-lookup-user": "مدیریت گروه‌های کاربری",
+       "userrights-lookup-user": "یک کاربر انتخاب بکه",
        "userrights-user-editname": "یک نام کاربری وارد کنید:",
-       "editusergroup": "ویرایش گروه‌های کاربری",
+       "editusergroup": "گروهه‌ل کاربر بار مه‌بئ",
        "editinguser": "تغییر اختیارات کاربری کاربر {{GENDER:$1|کاربر}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "ویرایش گروه‌های کاربری",
-       "saveusergroups": "هیشتِن(ذخیرە)گؤەڕیال(تغییرات)کوو(گروە)کاربەری",
+       "userrights-viewusergroup": "گروهه‌ل کاربری نشان بده",
+       "saveusergroups": "گروه {{GENDER:$1|کاربر}} قید بده",
        "userrights-groupsmember": "عضو:",
        "userrights-groupsmember-auto": "عضو ضمنی:",
        "userrights-groups-help": "شما می‌توانید گروه‌هایی را که کاربر در آن قرار دارد تغییر دهید:\n* جعبهٔ علامت‌خورده نشانهٔ بودن کاربر در آن گروه است.\n* جعبهٔ خالی نشانهٔ نبودن کاربر در آن گروه است.\n* علامت * به این معنی‌است که اگر آن گروه را بیفزایید نمی‌توانید بعداً برش دارید، و برعکس.",
        "right-managechangetags": "ایجاد و حذف [[Special:Tags|برچسب‌ها]] از پایگاه داده",
        "right-applychangetags": "تائید [[Special:Tags|برچسب]] بر روی تغییرات یک نفر",
        "right-changetags": "افزودن یا حذف [[Special:Tags|برچسب]] قراردادی بر روی نسخه یا سیاهه ورودی‌ها",
+       "right-deletechangetags": "[[Special:Tags|tags]] را اژ پایگاه پاک بکه",
+       "grant-generic": "حقوق \"$1\" بسته",
+       "grant-group-page-interaction": "تعاول با صفحه",
+       "grant-group-file-interaction": "تعامل با میدیا",
+       "grant-group-watchlist-interaction": "تعامل با لیست تماشای ایوه",
+       "grant-group-email": "ایمیل کل بکه",
+       "grant-group-high-volume": "انجام فعالیته‌ل حجم بالا",
        "grant-group-customization": "سفارشی‌سازی و تنظیمات",
+       "grant-group-administration": "انجام اقدامات اداری",
+       "grant-group-other": "فعالیته‌ل متفرقه",
+       "grant-blockusers": "کاربره‌ل بستن و واز کردن",
+       "grant-createaccount": "حسابه ایجاد بکه",
+       "grant-createeditmovepage": "صحفاته ایحاد بکه، تغییر بکه و انتقال بکه",
+       "grant-delete": "صفحاته، رویزیونه‌لی و ورود یومی را پاک بکه",
+       "grant-editinterface": "ناو میدیا-ویکی را و کربر CSS/JavaScript را تغییر بکه",
+       "grant-editmycssjs": "کاربر ایوه CSS/JavaScript را تغییر بکه",
+       "grant-editmyoptions": "ترجیحات کاربر ایوه را تغییر بکه",
+       "grant-editmywatchlist": "لیست تماشای ایوه را تغییر بکه",
+       "grant-editpage": "صفحات موجوده تغییر بکه",
+       "grant-editprotected": "صفحات محافظه را تغییر بکه",
+       "grant-highvolume": "تغییرات د سویه بالایه",
        "newuserlogpage": "سیاههٔ ایجاد کاربر",
        "newuserlogpagetext": "این سیاهه‌ای از نام‌های کاربری تازه‌ساخته‌شده است.",
        "rightslog": "سیاههٔ اختیارات کاربر",
        "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بارگذاری پرونده‌های جاوا مجاز نیست، چرا که ممکن است اجازه دور زدن محدودیت‌های امنیتی را بدهند.",
        "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 ab12992..15b6624 100644 (file)
        "directoryreadonlyerror": "ໄດເຣກທໍຣີ \"$1\" ສາມາດອ່ານໄດ້ເທົ່ານັ້ນ.",
        "directorynotreadableerror": "ໄດເຣກທໍຣີ \"$1\" ບໍ່ສາມາດອ່ານໄດ້.",
        "filenotfound": "ບໍ່ພົບໄຟລ໌ \"$1\".",
+       "formerror": "ຂໍ້ຜິດພາດ: ບໍ່ສາມາດສົ່ງແບບຟອມໄດ້.",
        "badarticleerror": "ບໍ່ສາມາດດຳເນີນການນີ້ຢູ່ເທິງໜ້ານີ້ໄດ້.",
        "cannotdelete": "ບໍ່ສາມາດລຶບໜ້າຫຼືໄຟລ໌ \"$1\" ໄດ້.\nມັນອາດຈະຖືກລຶບໂດຍໃຜຜູ້ໜຶ່ງແລ້ວ.",
        "cannotdelete-title": "ບໍ່ສາມາດລຶບໜ້າ \"$1\" ໄດ້",
        "myprivateinfoprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂໜ້າຂໍ້ມູນສ່ວນບຸກຄົນຂອງທ່ານ.",
        "mypreferencesprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂການຕັ້ງຄ່າຂອງທ່ານ.",
        "ns-specialprotected": "ບໍ່ສາມາດແກ້ໄຂໜ້າພິເສດໄດ້.",
+       "invalidtitle-knownnamespace": "ຊື່ເລື່ອງທີ່ມີຂອບເຂດຊື່ \"$2\" ແລະຂໍ້ຄວາມ \"$3\" ບໍ່ຖືກຕ້ອງ",
+       "invalidtitle-unknownnamespace": "ຊື່ເລື່ອງທີ່ມີຂອບເຂດຊື່ໝາຍເລກ $1 ແລະຂໍ້ຄວາມ \"$2\"",
        "exception-nologin": "ບໍ່ໄດ້ເຂົ້າສູ່ລະບົບ",
        "exception-nologin-text": "ກະລຸນາເຂົ້າສູ່ລະບົບເພື່ອໃຫ້ສາມາດເຂົ້າເບິ່ງ ຫຼື ດຳເນີນການໃດໆກັບໜ້ານີ້ໄດ້.",
        "exception-nologin-text-manual": "ກະລຸນາ $1 ເພື່ອໃຫ້ສາມາດເຂົ້າເບິ່ງ ຫຼື ດຳເນີນການໃດໆກັບໜ້ານີ້ໄດ້.",
        "prefs-misc": "ແລະອື່ນໆ",
        "saveprefs": "ບັນທຶກ",
        "prefs-editing": "ການດັດແກ້",
-       "rows": "ແຖວ:",
-       "columns": "ຖັນ:",
        "searchresultshead": "ຊອກຫາ",
        "recentchangesdays": "ຈຳນວນມື້ສະແດງໃນການປ່ຽນແປງຫຼ້າສຸດ:",
        "recentchangescount": "ຈຳນວນການແກ້ໄຂທີ່ຕ້ອງການສະແດງໂດຍປະລິຍາຍ:",
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 16ed0bb..195699d 100644 (file)
        "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",
        "userrights-nodatabase": "Duomenų bazė $1 neegzistuoja arba yra ne vietinė.",
        "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.",
        "group": "Grupė:",
        "group-user": "Naudotojai",
        "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-highlightmenu-title": "Pasirinkti spalvą",
+       "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.",
        "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",
        "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",
index 53ca304..c0035b9 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",
        "searcharticle": "Aiziet!",
        "history": "hronoloģija",
        "history_short": "Vēsture",
+       "history_small": "vēsture",
        "updatedmarker": "atjaunināti kopš pēdējā apmeklējuma",
        "printableversion": "Drukājama versija",
        "permalink": "Pastāvīgā saite",
        "views": "Apskates",
        "toolbox": "Rīki",
        "tool-link-userrights": "Mainīt {{GENDER:$1|dalībnieka|dalībnieces}} grupas",
+       "tool-link-userrights-readonly": "Apskatīt {{GENDER:$1|dalībnieka|dalībnieces}} grupas",
        "tool-link-emailuser": "Nosūtīt e-pastu {{GENDER:$1|šim dalībniekam|šai dalībniecei}}",
        "userpage": "Skatīt dalībnieka lapu",
        "projectpage": "Skatīt projekta lapu",
        "newarticletext": "Šajā projektā vēl nav lapas ar šādu nosaukumu.\nLai izveidotu lapu, sāc rakstīt teksta logā apakšā (par teksta formatēšanu un sīkākai informācija skatīt [$1 palīdzības lapu]).\nJa tu šeit nonāci kļūdas pēc, vienkārši uzspied <strong>back</strong> pogu pārlūkprogrammā.",
        "anontalkpagetext": "----''Šī ir diskusiju lapa anonīmam dalībniekam, kurš vēl nav kļuvis par reģistrētu dalībnieku vai arī neizmanto savu dalībnieka vārdu. Tādēļ mums ir jāizmanto skaitliskā IP adrese, lai viņu identificētu.\nŠāda IP adrese var būt vairākiem dalībniekiem.\nJa tu esi anonīms dalībnieks un uzskati, ka tev ir adresēti neatbilstoši komentāri, lūdzu, [[Special:CreateAccount|kļūsti par dalībnieku]] vai arī [[Special:UserLogin|izmanto jau izveidotu dalībnieka vārdu]], lai izvairītos no turpmākām neskaidrībām un tu netiktu sajaukts ar citiem anonīmiem dalībniekiem.''",
        "noarticletext": "Šajā lapā šobrīd nav nekāda teksta, tu vari [[Special:Search/{{PAGENAME}}|meklēt citās lapās pēc šīs lapas nosaukuma]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītos reģistru ierakstos] vai arī [{{fullurl:{{FULLPAGENAME}}|action=edit}} sākt rediģēt šo lapu]</span>.",
-       "noarticletext-nopermission": "Šajā lapā pašlaik nav nekāda teksta.\nTu vari [[Special:Search/{{PAGENAME}}|meklēt šīs lapas nosaukumu]] citās lapās,\nvai <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītus reģistru ierakstus]</span>, bet jums nav atļauja izveidot si lapu.",
+       "noarticletext-nopermission": "Šajā lapā pašlaik nav nekāda teksta.\nTu vari [[Special:Search/{{PAGENAME}}|meklēt šīs lapas nosaukumu]] citās lapās,\nvai <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītus reģistru ierakstus]</span>, bet jums nav atļauja izveidot šo lapu.",
        "userpage-userdoesnotexist": "Lietotājs \"<nowiki>$1</nowiki>\" nav reģistrēts.\nLūdzu, pārliecinies vai vēlies izveidot/izmainīt šo lapu.",
        "userpage-userdoesnotexist-view": "Dalībnieks \"$1\" nav reģistrēts.",
        "blocked-notice-logextract": "Šis dalībnieks pašlaik ir nobloķēts.\n\nPēdējais bloķēšanas reģistra ieraksts ir apskatāms zemāk:",
        "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",
        "right-unblockself": "Atbloķēt sevi",
        "right-protect": "Izmainīt aizsargātās lapas un to aizsardzības līmeni",
        "right-editprotected": "Labot aizsargātās lapas (bez kaskādes aizsardzības)",
+       "right-editcontentmodel": "Labot lapas satura modeli",
        "right-editinterface": "Izmainīt dalībnieka interfeisu",
        "right-editusercssjs": "Izmainīt citu dalībnieku CSS un JS failus",
        "right-editusercss": "Izmainīt citu dalībnieku CSS failus",
        "right-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",
        "action-upload_by_url": "augšupielādēt šo failu no URL",
        "action-writeapi": "izmantot rakstīto lietojumprogrammu saskarni",
        "action-delete": "izdzēst šo lapu",
-       "action-deleterevision": "izdzēst šo versiju",
-       "action-deletedhistory": "skatīt šīs lapas dzēsto hronoloģiju",
+       "action-deleterevision": "dzēst versijas",
+       "action-deletelogentry": "dzēst žurnāla ierakstus",
+       "action-deletedhistory": "skatīt šīs lapas dzēsto vēsturi",
        "action-browsearchive": "meklēt dzēstās lapas",
        "action-undelete": "atjaunot šo lapu",
        "action-suppressrevision": "pārskatīt un atjaunot šo slēpto versiju",
        "recentchanges-legend-heading": "<strong>Apzīmējumi:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (skatīt arī [[Special:NewPages|jaunās lapas]])",
        "recentchanges-submit": "Rādīt",
+       "rcfilters-invalid-filter": "Nederīgs filtrs",
+       "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-noresults": "Filtri nav atrasti",
+       "rcfilters-filtergroup-registration": "Lietotāja reģistrācija",
+       "rcfilters-filtergroup-changetype": "Izmaiņu veids",
+       "rcfilters-filter-pageedits-label": "Lapu labojumi",
+       "rcfilters-filter-pageedits-description": "Labojumi vikivietnes saturā, diskusijā, kategoriju aprakstos...",
+       "rcfilters-filter-newpages-label": "Lapu veidošana",
+       "rcfilters-filter-newpages-description": "Labojumi, kas veido jaunas lapas.",
+       "rcfilters-filter-categorization-label": "Kategoriju izmaiņas",
+       "rcfilters-filter-categorization-description": "Ieraksti par lapu pievienošanu vai noņemšanu no kategorijām.",
+       "rcfilters-filter-logactions-label": "Reģistrētās darbības",
+       "rcfilters-filter-logactions-description": "Administratīvās darbības, kontu veidošana, lapu dzēšana, augšupielādes...",
        "rcnotefrom": "Šobrīd redzamas izmaiņas kopš '''$2''' (parādītas ne vairāk par '''$1''').",
        "rclistfrom": "Parādīt jaunas izmaiņas kopš $3 $2",
        "rcshowhideminor": "$1 maznozīmīgos",
        "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:",
        "apihelp-no-such-module": "Modulis \"$1\" nav atrasts.",
        "apisandbox": "API smilškaste",
        "apisandbox-api-disabled": "API ir atspējots šajā tīmekļa vietnē.",
+       "apisandbox-unfullscreen": "Rādīt lapau",
+       "apisandbox-submit": "Izveidot pieprasījumu",
        "apisandbox-reset": "Notīrīt",
        "apisandbox-retry": "Mēģināt vēlreiz",
        "apisandbox-no-parameters": "Šo API modulim nav parametru.",
        "apisandbox-dynamic-parameters-add-placeholder": "Parametra nosaukums",
        "apisandbox-results": "Rezultāti",
        "apisandbox-request-url-label": "Pieprasījuma URL:",
+       "apisandbox-request-json-label": "Pieprasījuma JSON:",
        "apisandbox-request-time": "Pieprasījuma izpildes laiks: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-continue": "Turpināt",
        "apisandbox-continue-clear": "Notīrīt",
+       "apisandbox-multivalue-all-namespaces": "$1 (visas vārdtelpas)",
+       "apisandbox-multivalue-all-values": "$1 (visas vērtības)",
        "booksources": "Grāmatu avoti",
        "booksources-search-legend": "Meklēt grāmatu avotus",
        "booksources-search": "Meklēt",
        "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\"",
        "pageinfo-watchers": "Lapas uzraudzītāju skaits",
        "pageinfo-redirects-name": "Pāradresāciju skaits uz šo lapu",
        "pageinfo-subpages-name": "Šīs lapas apakšlapas",
+       "pageinfo-firstuser": "Lapas izveidotājs",
+       "pageinfo-firsttime": "Lapas izveides datums",
        "pageinfo-lastuser": "Pēdējais labotājs",
+       "pageinfo-lasttime": "Pēdējā labojuma datums",
        "pageinfo-edits": "Kopējais izmaiņu skaits",
        "pageinfo-authors": "Kopējais atsevišķu autoru skaits",
        "pageinfo-toolboxlink": "Lapas informācija",
        "pageinfo-category-pages": "Lapu skaits",
        "pageinfo-category-subcats": "Apakškategoriju skaits",
        "pageinfo-category-files": "Failu skaits",
+       "pageinfo-user-id": "Lietotāja ID",
        "markaspatrolleddiff": "Atzīmēt kā pārbaudītu",
        "markaspatrolledtext": "Atzīmēt šo lapu kā pārbaudītu",
        "markedaspatrolled": "Atzīmēta kā pārbaudīta",
        "patrol-log-page": "Pārbaudes reģistrs",
        "patrol-log-header": "Šis ir pārbaudīto versiju reģistrs.",
        "log-show-hide-patrol": "$1 pārbaudes reģistrs",
+       "confirm-markpatrolled-button": "Labi",
        "deletedrevision": "Izdzēstā vecā versija $1",
        "filedeleteerror-short": "Kļūda dzēšot failu: $1",
        "filedeleteerror-long": "Kļūdas, kas radās failu dzēšanas laikā:\n\n$1",
        "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",
        "feedback-submit": "Iesniegt",
        "feedback-thanks": "Paldies! Jūsu atsauksmes ir ievietotas lapā \"[$2  $1]\".",
        "feedback-thanks-title": "Paldies!",
+       "feedback-useragent": "Lietotāja aģents:",
        "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.",
+       "duration-seconds": "$1 {{PLURAL:$1|sekundes|sekunde|sekundes}}",
+       "duration-minutes": "$1 {{PLURAL:$1|minūtes|minūte|minūtes}}",
+       "duration-hours": "$1 {{PLURAL:$1|stundas|stunda|stundas}}",
+       "duration-days": "$1 {{PLURAL:$1|dienas|diena|dienas}}",
+       "duration-weeks": "$1 {{PLURAL:$1|nedēļas|nedēļa|nedēļas}}",
+       "duration-years": "$1 {{PLURAL:$1|gadi|gads|gadi}}",
+       "duration-decades": "$1 {{PLURAL:$1|desmitgades|desmitgade|desmitgades}}",
+       "duration-centuries": "$1 {{PLURAL:$1|gadsimti|gadsimts|gadsimti}}",
+       "duration-millennia": "$1 {{PLURAL:$1|tūkstošgades|tūkstošgade|tūkstošgades}}",
        "limitreport-title": "Parsētāja profilēšanas dati:",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|sekundes|sekunde|sekundes}}",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|sekundes|sekunde|sekundes}}",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|baiti|baits|baiti}}",
        "limitreport-templateargumentsize": "Veidnes argumenta izmērs",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|baiti|baits|baiti}}",
        "special-characters-group-gujarati": "Gudžarati",
        "mw-widgets-dateinput-no-date": "Nav izvēlēts datums",
        "mw-widgets-titleinput-description-new-page": "lapa vēl nepastāv",
+       "mw-widgets-categoryselector-add-category-placeholder": "Pievienot kategoriju...",
+       "sessionprovider-generic": "$1 sesijas",
        "authmanager-email-label": "E-pasts",
        "authmanager-email-help": "E-pasta adrese",
        "authmanager-realname-label": "Tavs īstais vārds",
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..5f512ff 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",
        "missingarticle-rev": "(famerenana faha : $1)",
        "missingarticle-diff": "(diff : $1 ; $2)",
        "readonly_lag": "\nMihidy ho azy aloha ny banky angona mandra-pahatratran'ny serveur andevo ny tompony",
+       "nonwrite-api-promise-error": "Ny loha HTTP \"<code>Promise-Non-Write-API-Action:</code>\" dia nalefa fa tsy natao tany amina module fanoratana API ny hataka",
        "internalerror": "Tsy fetezana anatin'ny rindrankajy",
        "internalerror_info": "Tsy fetezana ety anatiny : $1",
        "internalerror-fatal-exception": "Karazana-kadisoana nampijanona \"$1\"",
        "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.",
-       "changeemail": "Hanova ny adiresy imailaka",
-       "changeemail-header": "Hanova ny adiresy imailak'ilay kaonty",
+       "passwordreset-nocaller": "Mila manitsy mpiantso",
+       "passwordreset-nosuchcaller": "Tsy misy ilay mpiantso: $1",
+       "passwordreset-invalidemail": "Adiresy mailaka tsy azo raisina",
+       "passwordreset-nodata": "Tsy nanome anaram-pikambana na adiresy mailaka",
+       "changeemail": "Hanova na hanala adiresy mailaka",
+       "changeemail-header": "Fenoy ity fôrmiolera ity ahafahanao manova ny adiresy mailakao. Raha tianao ho esorina ny fifandraisan'ity mailaka ity amin'ny kaontinao dia avelao ho fotsy ny saha rehefa mandefa fôrmiolera.",
        "changeemail-no-info": "Mila tafiditra ianao vao avaka mijery ity pejy ity.",
        "changeemail-oldemail": "Adiresy imailaka ankehitriny :",
        "changeemail-newemail": "Adiresy imailaka vaovao :",
        "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",
        "search-external": "Hikaroka any ivelany",
        "searchdisabled": "Tsy nalefa ny karoka eto amin'i {{SITENAME}}. Afaka mampiasa an'i Google aloha ianao mandra-paha. Nefa fantaro fa mety ho efa lany daty ny valiny omeny.",
        "search-error": "Hadisoana nitranga tam-pikarohana: $1",
+       "search-warning": "Fampitandremana nitranga teo am-pikarohana: $1",
        "preferences": "Ny momba anao",
        "mypreferences": "Safidy",
        "prefs-edits": "isa ny fanovàna :",
        "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-highlightbutton-title": "Hampibaribary ny valiny",
+       "rcfilters-highlightmenu-title": "Hisafidy loko",
+       "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",
+       "rcfilters-filter-newpages-label": "Famoronam-pejy",
+       "rcfilters-filter-newpages-description": "Fiovana nahatonga famoronam-pejy.",
+       "rcfilters-filter-categorization-label": "Fiovana amin'ny sokajy",
+       "rcfilters-filter-categorization-description": "Fandraiketana an'ireo pejy ampiana na esorina amin'ny sokajy.",
+       "rcfilters-filter-logactions-label": "Asa voalaogy",
        "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.",
        "upload-copy-upload-invalid-domain": "Tsy misy eto amin'ity dômenina ity ny tahaky ny upload.",
        "upload-dialog-title": "Hanafatra rakitra",
        "upload-dialog-button-cancel": "Aoka",
+       "upload-dialog-button-back": "Hiverina",
        "upload-dialog-button-done": "Vita",
        "upload-dialog-button-save": "Tehirizina",
        "upload-dialog-button-upload": "Mampiditra",
        "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",
        "special-characters-group-khmer": "kimera",
        "special-characters-title-endash": "tsipika anglisy",
        "special-characters-title-emdash": "tsipika em",
-       "special-characters-title-minus": "marika mainosy"
+       "special-characters-title-minus": "marika mainosy",
+       "sessionmanager-tie": "Tsy afaka mampikambana karazan-kataka fampamantarana maromaro: $1.",
+       "authmanager-authn-not-in-progress": "Tsy andalam-panaovana ny fampamantarana, na very ny angon'ny sesiôna. Avereno hatramin'ny voalohany azafady.",
+       "authmanager-authplugin-setpass-failed-title": "Tsy nahomby ny fanovana tenimiafina",
+       "authmanager-authplugin-setpass-failed-message": "Nandà ny fanovana tenimiafina ny plugin fampamantarana.",
+       "authmanager-authplugin-create-fail": "Nandà ny famoronan-kaonty ny plugin fampamantarana.",
+       "authmanager-authplugin-setpass-denied": "Tsy ahafahana manova tenimiafina ny plugin fampamantarana.",
+       "authmanager-userlogin-remembermypassword-help": "Milaza raha tsy maintsy tadidiana mihoatra ny halafan'ny fotoam-pitsidihana ny tenimiafina.",
+       "authmanager-username-help": "Anaram-pikambana ho an'ny fampamantarana.S",
+       "authmanager-password-help": "Tenimiafina ho an'ny fampamantarana.",
+       "authmanager-retype-help": "tenimiafina indray hanamarinana.",
+       "authmanager-provider-password": "Fampamamtarana mifototra amin'ny tenimiafina",
+       "authmanager-provider-password-domain": "Fampamantarana mifototra amin'ny tenimiafina ary vala",
+       "authmanager-provider-temporarypassword": "Tenimiafina vonjimaika",
+       "authprovider-resetpass-skip-help": "Handingana ny famerenam-tenimiafina.",
+       "authform-nosession-login": "nahomby ny fidirana, fa tsy mahatadidy anao tafiditra ny mpitety tranonkalanao."
 }
index 8839a78..629386b 100644 (file)
        "mytalk": "Каҥашымаш",
        "anontalk": "Каҥашымаш тиде IP нерген",
        "navigation": "Навигаций",
+       "and": "&#32;да",
        "qbfind": "Муаш",
        "qbedit": "Тӧрлаташ",
        "qbpageoptions": "Тиде лаштык",
        "view": "Ончалаш",
        "edit": "Тӧрлаташ",
        "create": "Ышташ",
-       "editthispage": "Тӧрлаташ тиде лаштыкым",
+       "editthispage": "Тиде лаштыкым тӧрлаташ",
        "create-this-page": "Тиде лаштыкым ышташ",
        "delete": "Шӧраш",
        "deletethispage": "Тиде лаштыкым шӧраш",
        "emailauthenticated": "Тыйын почто адресетым пеҥгыдемдыме $2, $3.",
        "loginlanguagelabel": "Йылме: $1",
        "pt-login": "Пураш",
+       "pt-createaccount": "Регистрацийым эрте",
        "pt-userlogout": "Лекташ",
        "changepassword": "Шолыпмутым вашталташ",
        "oldpassword": "Тошто шолыпмут:",
        "minoredit": "Тиде изи вашталтыш",
        "watchthis": "Тиде лаштыкым эскераш",
        "savearticle": "Лаштыкым аралаш",
+       "savechanges": "Лаштыкым аралаш",
+       "publishchanges": "Лаштыкым аралаш",
        "preview": "Ончылгоч ончымаш",
        "showpreview": "Ончылгоч ончымаш",
        "showdiff": "Тӧрлатымашым ончыкташ",
-       "anoneditwarning": "'''ТӱÑ\82кӧ Ð»Ð¸Ð¹:''': Ð¢Ñ\8bй Ð°Ð²Ñ\82оÑ\80изаÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82ен Ð¾Ñ\82Ñ\8bл. Ð¢Ñ\8bйÑ\8bн IP-адÑ\80еÑ\81еÑ\82 Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð²Ð°Ñ\88Ñ\82алÑ\82Ñ\8bмаÑ\88 Ð¸Ñ\81Ñ\82оÑ\80ийÑ\8bÑ\88Ñ\82Ñ\8bже Ð²Ð¾Ð·Ð°Ð»Ñ\82 ÐºÐ¾Ð´ÐµÑ\88. Ð¨ÐºÐµ Ð»Ó±Ð¼ÐµÑ\82 Ð´ÐµÐ½ Ð¿Ñ\83Ñ\80еÑ\82 Ð°Ð»Ðµ Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82еÑ\82 Ð³Ñ\8bн, Ñ\88каланет пашам ышташ йӧнлырак лиеш.",
+       "anoneditwarning": "'''ТӱÑ\82кӧ Ð»Ð¸Ð¹:''': Ð¢Ñ\8bй Ð°Ð²Ñ\82оÑ\80изаÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82ен Ð¾Ñ\82Ñ\8bл. Ð¢Ñ\8bйÑ\8bн IP-адÑ\80еÑ\81еÑ\82 Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð²Ð°Ñ\88Ñ\82алÑ\82Ñ\8bмаÑ\88 Ð¸Ñ\81Ñ\82оÑ\80ийÑ\8bÑ\88Ñ\82Ñ\8bже Ð²Ð¾Ð·Ð°Ð»Ñ\82 ÐºÐ¾Ð´ÐµÑ\88. Ð¨ÐºÐµ Ð»Ó±Ð¼ÐµÑ\82 Ð´ÐµÐ½ Ð¿Ñ\83Ñ\80еÑ\82 Ð°Ð»Ðµ Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82еÑ\82 Ð³Ñ\8bн, Ñ\82Ñ\8bлат пашам ышташ йӧнлырак лиеш.",
        "summary-preview": "Тӧрлатымаш нерген ончылгоч ончымаш:",
        "accmailtitle": "Шолыпмут колтымо.",
        "newarticle": "(У)",
-       "newarticletext": "Тыгай лӱман лаштык уке.\nЛаштыкым ышташлан ӱлнӧ возаш тӱҥал (сайынрак палашлан [$1 полшыкым] ончал).\nТый тышке йонгылыш логалынат гын, браузерыште '''шенгек''' полдышым темдал.",
+       "newarticletext": "Тыгай лӱман лаштык уке.\nЛаштыкым ышташлан ӱлнӧ возаш тӱҥал (сайынрак палашлан [$1 полшыкым] ончал).\nТый тышке йоҥылыш логалынат гын, браузерыште '''шенгек''' полдышым темдал.",
        "noarticletext": "Кызытсе жаплан тиде лаштыкыште нимом возымо огыл.\nТый тиде лаштыкын лӱмжым вес лаштык-влакыште [[Special:Search/{{PAGENAME}}|кычалын]] кертат, але <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журнал-влакыште кычалын] кертат, але [{{fullurl:{{FULLPAGENAME}}|action=edit}} тыгай лӱман лаштыкым ыштен] кертат</span>.",
        "clearyourcache": "'''Замечание.''' Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.\n* '''Firefox / Safari:''' Удерживая клавишу ''Shift'', нажмите на панели инструментов ''Обновить'' либо нажмите ''Ctrl-F5'' или ''Ctrl-R'' (''⌘-R'' на Mac)\n* '''Google Chrome:''' Нажмите ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Mac)\n* '''Internet Explorer:''' Удерживая ''Ctrl'', нажмите ''Обновить'' либо нажмите ''Ctrl-F5''\n* '''Opera:''' Выберите очистку кэша в меню ''Инструменты → Настройки''",
        "previewnote": "'''Тиде ончылгоч ончымаш гына;\nвашталтыш-влакым эше аралыме огыл!'''",
        "group-bot-member": "бот",
        "grouppage-bot": "{{ns:project}}:Бот-влак",
        "grouppage-sysop": "{{ns:project}}:Сайтвиктарыше-влак",
+       "right-writeapi": "Возымашлан API-ым кучылтмаш",
        "newuserlogpage": "У пайдаланыше регистрацийым эртарыме журнал",
        "rightslog": "Участникын праваже-влакым ончыктышо журнал",
        "action-edit": "тиде лаштыкым тӧрлаташ",
        "minoreditletter": "и",
        "newpageletter": "У",
        "boteditletter": "б",
+       "rc-change-size-new": "Вашталтымаш деч вара $1 {{PLURAL:$1|байт}} лийын",
        "rc-enhanced-expand": "Тичмашын ончыкташ",
        "rc-enhanced-hide": "Рашлык-влакым шылташ",
        "recentchangeslinked": "Ваш кылдалтше тӧрлатымаш-влак",
        "uploadlogpage": "Оптымаш-влак журнал",
        "filedesc": "Файл нерген кӱчыкын увертараш",
        "fileuploadsummary": "Тидын нерген кӱчыкын:",
+       "savefile": "Файлым арален кодаш",
        "watchthisupload": "Тиде файлым эскераш",
        "license-header": "Лицензирований",
        "imgfile": "файл",
        "protectexpiry": "Мучашлалтеш:",
        "protect_expiry_invalid": "Йоҥылыш мучашлалтше жап.",
        "protect_expiry_old": "Мучашлалтше жап эртен.",
-       "protect-text": "Тыште тый '''$1''' лаштыкын шыгыремдымашыжым ончалаш да тӧрлаташ кертат.",
+       "protect-text": "Тыште тый '''$1''' лаштыкын аралымаш уровеньжым ончалын але вашталтен кертат.",
        "protect-locked-access": "Тыйын лаштыкын шыгыремдымашыжым тӧрлаш кертмешет шагал.\nӰлнӧ '''$1''' лаштыкын кызытсе келыштарымаш.",
        "protect-cascadeon": "Тиде лаштыкым тӧрлатымаш деч аралыме.  \nКаскадный аралымашан {{PLURAL:$1|лаштык-влак}} тудо пура.",
        "protect-default": "Чыла пайдаланыше-влаклан йӧным пуаш",
        "file-nohires": "Кугурак чаплык уке.",
        "svg-long-desc": "SVG файл, шкенжын кугытшо: $1 × $2 пиксел, файлын кугытшо: $3",
        "show-big-image": "Тӱҥалтыш файл",
+       "show-big-image-preview": "Ончылгоч ончымо годым кугыт: $1",
        "show-big-image-size": "$1 × $2 пиксел",
        "newimages-legend": "Фильтр",
        "ilsubmit": "Кычал",
        "specialpages-group-pagetools": "Лаштык ӱзгар-влак",
        "specialpages-group-redirects": "Вес вере колтышо спецлаштык-влак",
        "external_image_whitelist": " #Оставьте эту строчку такой, как она есть<pre>\n#Разместите здесь фрагменты регулярных выражений (ту часть, что находится между //)\n#они будут соотнесены с URL внешних изображений.\n#Подходящие будут показаны как изображения, остальные будут показаны как ссылки на изображения.\n#Строки, начинающиеся с # считаются комментариями.\n#Строки не чувствительны к регистру\n\n#Размещайте фрагменты регулярных выражений над этой строчкой. Оставьте эту строчку такой, как она есть.</pre>",
-       "logentry-delete-delete": "$1 {{GENDER:$2|лыктын|лыктын}} странице $3",
+       "tag-filter": "[[Special:Tags|Метке]] фильтр:",
+       "logentry-delete-delete": "$1 {{GENDER:$2|шӧрен|шӧрен}} лаштыкым $3",
+       "logentry-newusers-create": "Пайдаланыше {{GENDER:$2}} $1 лаштыкым ыштен.",
        "revdelete-summary": "тӧрлатымаш-влакым возен ончыктымаш",
-       "searchsuggest-search": "Кычалаш",
+       "searchsuggest-search": "{{SITENAME}} сайтыште кычалаш",
        "expand_templates_ok": "Йӧра",
        "expand_templates_preview": "Ончылгоч ончымаш"
 }
index 4d1fbcf..4872f4a 100644 (file)
@@ -19,7 +19,8 @@
                        "Macofe",
                        "Nemo bis",
                        "Matma Rex",
-                       "Kaldari"
+                       "Kaldari",
+                       "Xð"
                ]
        },
        "tog-underline": "Потцртување на врски:",
        "searcharticle": "Дај",
        "history": "историја",
        "history_short": "Историја",
+       "history_small": "историја",
        "updatedmarker": "подновено од мојата последна посета",
        "printableversion": "Верзија за печатење",
        "permalink": "Постојана врска",
        "unprotectthispage": "Измена на заштитата на страницава",
        "newpage": "Нова страница",
        "talkpage": "Разговор",
-       "talkpagelinktext": "Разговор",
+       "talkpagelinktext": "разговор",
        "specialpage": "Службена страница",
        "personaltools": "Лични алатки",
        "articlepage": "Преглед на содржината",
        "eauthentsent": "На назначената адреса е испратена потврдна порака.\nПред да се испрати друга порака на корисничката сметка, ќе морате да ги проследите напатствијата во пораката, за да потврдите дека таа корисничка сметка е навистина ваша.",
        "throttled-mailpassword": "Веќе е испратена порака за измена на лозинката во {{PLURAL:$1|изминатиов час|изминативе $1 часа}}.\nЗа да се спречи злоупотреба, само едно потсетување може да се праќа на {{PLURAL:$1|секој час|секои $1 часа}}.",
        "mailerror": "Грешка при испраќање на е-поштата: $1",
-       "acct_creation_throttle_hit": "Посетители на ова вики користејќи ја вашата IP-адреса создале {{PLURAL:$1|1 сметка|$1 сметки}} во последниве $2, при што е достигнат најголемиот допуштен број на кориснички сметки предвиден и овозможен за овој период.\nКако резултат на ова, посетителите кои ја користат оваа IP-адреса во моментов нема да можат да создаваат нови сметки.",
+       "acct_creation_throttle_hit": "Посетители на ова вики користејќи ја вашата IP-адреса создале {{PLURAL:$1|1 сметка|$1 сметки}} во последниве $2, при што е достигнат најголемиот допуштен број на кориснички сметки предвиден и овозможен за овој период.\nКако последица на ова, посетителите кои ја користат оваа IP-адреса во моментов нема да можат да создаваат нови сметки.",
        "emailauthenticated": "Вашата е-пошта адреса е потврдена на $2 во $3 ч.",
        "emailnotauthenticated": "Вашата е-поштенска адреса сè уште не е потврдена.\nНема да биде испратена е-пошта во ниту еден од следниве случаи.",
        "noemailprefs": "Наведете е-поштенска адреса за да функционираат следниве својства.",
        "selfredirect": "<strong>Предупредување:</strong> Создавате пренасочување кон истата статија.\nМоже да сте укажале грешна целна страница, или пак уредувате погрешна страница.\nАко стиснете на „{{int:savearticle}}“ повторно, тогаш пренасочувањето бездруго ќе се создаде.",
        "missingcommenttext": "Ве молиме внесете коментар подолу.",
        "missingcommentheader": "<strong>Потсетување:</strong> Не внесовте наслов за овој коментар.\nАко повторно стиснете на „{{int:savearticle}}“, уредувањето ќе биде зачувано без наслов.",
-       "summary-preview": "Ð\98зглед на описот:",
+       "summary-preview": "Ð\9fÑ\80еглед на описот:",
        "subject-preview": "Преглед на насловот:",
        "previewerrortext": "Се појави грешка при обидот да се прегледаат промените.",
        "blockedtitle": "Корисникот е блокиран",
        "nextn": "{{PLURAL:следна $1|следни $1}}",
        "prev-page": "претходна страница",
        "next-page": "следна страница",
-       "prevn-title": "{{PLURAL:$1|Ð\9fÑ\80еÑ\82Ñ\85оден|Ð\9fÑ\80еÑ\82Ñ\85одни}} $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82\80езÑ\83лÑ\82аÑ\82и}}",
-       "nextn-title": "{{PLURAL:$1|Следен|Следни}} $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82\80езÑ\83лÑ\82аÑ\82и}}",
-       "shown-title": "Ð\9fÑ\80икажи $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82\80езÑ\83лÑ\82аÑ\82и}} Ð½Ð° страница",
+       "prevn-title": "{{PLURAL:$1|Ð\9fÑ\80еÑ\82Ñ\85одна|Ð\9fÑ\80еÑ\82Ñ\85одни}} $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}}",
+       "nextn-title": "{{PLURAL:$1|Следна|Следни}} $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}}",
+       "shown-title": "Ð\9fÑ\80икажи $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}} Ð¿Ð¾ страница",
        "viewprevnext": "Погледајте ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''На ова вики има страница со наслов „[[:$1]]“'''",
        "searchmenu-new": "<strong>Создајте ја страницата „[[:$1]]“ на ова вики!</strong> {{PLURAL:$2|0=|Погледајте ја и страницата најдена со пребарувањето.|Погледајте го и најденото од пребарувањето.}}",
        "search-interwiki-caption": "Збратимени проекти",
        "search-interwiki-default": "Најдено на $1:",
        "search-interwiki-more": "(уште)",
+       "search-interwiki-more-results": "повеќе ставки",
        "search-relatedarticle": "Поврзано",
        "searchrelated": "поврзано",
        "searchall": "сè",
-       "showingresults": "Подолу {{PLURAL:$1|е прикажан '''1''' резултат|се прикажани '''$1''' резултати}} почнувајќи од бр. '''$2'''.",
-       "showingresultsinrange": "Ð\94олÑ\83 {{PLURAL:$1|е Ð¿Ñ\80икажан Ð´Ð¾ <strong>еден</strong> Ñ\80езÑ\83лÑ\82аÑ\82\81е Ð¿Ñ\80икажани Ð´Ð¾ <strong>$1</strong> Ñ\80езÑ\83лÑ\82аÑ\82и}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
-       "search-showingresults": "{{PLURAL:$4|РезÑ\83лÑ\82аÑ\82 <strong>$1</strong> Ð¾Ð´ <strong>$3</strong>|РезÑ\83лÑ\82аÑ\82и <strong>$1 - $2</strong> од <strong>$3</strong>}}",
-       "search-nonefound": "Нема резултати што одговараат на бараното.",
-       "search-nonefound-thiswiki": "Ð\9dема Ñ\80езÑ\83лÑ\82аÑ\82и што одговараат на бараното на ова мрежно место.",
+       "showingresults": "Подолу {{PLURAL:$1|е прикажана <strong>1</strong> ставка|се прикажани <strong>$1</strong> ставки}} почнувајќи од бр. <strong>$2</strong>.",
+       "showingresultsinrange": "Ð\9fодолÑ\83 {{PLURAL:$1|е Ð¿Ñ\80икажана Ð´Ð¾ <strong>една</strong> Ñ\81Ñ\82авка|Ñ\81е Ð¿Ñ\80икажани Ð´Ð¾ <strong>$1</strong> Ñ\81Ñ\82авки}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|СÑ\82авка <strong>$1</strong> Ð¾Ð´ <strong>$3</strong>|СÑ\82авки <strong>$1 - $2</strong> од <strong>$3</strong>}}",
+       "search-nonefound": "Нема исходни ставки што одговараат на бараното.",
+       "search-nonefound-thiswiki": "Ð\9dема Ñ\81Ñ\82авки што одговараат на бараното на ова мрежно место.",
        "powersearch-legend": "Напредно пребарување",
        "powersearch-ns": "Пребарај во следниве именски простори:",
        "powersearch-togglelabel": "Избор:",
        "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": "Јазик:",
        "editusergroup": "Вчитај кориснички групи",
        "editinguser": "Менување на правата на {{GENDER:$1|корисникот}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Поглед на правата на {{GENDER:$1|корисникот}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Уреди ги корисничките групи",
-       "userrights-viewusergroup": "Преглед на корисничките групи",
+       "userrights-editusergroup": "Уреди ги {{GENDER:$1|корисничките}} групи",
+       "userrights-viewusergroup": "Преглед на {{GENDER:$1|корисничките}} групи",
        "saveusergroups": "Зачувај ги {{GENDER:$1|корисничките}} групи",
        "userrights-groupsmember": "Член на:",
        "userrights-groupsmember-auto": "Подразбран член на:",
-       "userrights-groups-help": "Можете да измените на кои групи припаѓа корисник:\n* Штиклирано - корисникот е во таа група.\n* Нештиклирано - корисникот не припаѓа на групата.\n* Ѕвездичка (*) - не можете да ја отстраните групата откако сте ја додале (и обратно).",
+       "userrights-groups-help": "Можете да измените на кои групи припаѓа корисник:\n* Штиклирано — корисникот е во таа група.\n* Нештиклирано — корисникот не припаѓа на групата.\n* Ѕвездичка (*) — не можете да ја отстраните групата откако сте ја додале (и обратно).\n* Тараба (#) — можете само да го вратите истекот на групава, но не можете да го поместите нанапред.",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "Немате дозвола за уредување на кориснички права на други викија.",
        "userrights-nodatabase": "Базата на податоци $1 не постои или не е месна.",
        "userrights-changeable-col": "Групи кои може да ги промените",
        "userrights-unchangeable-col": "Групи кои не може да ги промените",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "Истекува $1",
+       "userrights-expiry-none": "Не истекува",
+       "userrights-expiry": "Истекува:",
+       "userrights-expiry-existing": "Постоечки рок на истекување: $3, $2",
+       "userrights-expiry-othertime": "Друго време:",
+       "userrights-expiry-options": "1 ден:1 day,1 недела:1 week,1 месец:1 month,3 месеци:3 months,6 месеци:6 months,1 година:1 year",
+       "userrights-invalid-expiry": "Истекот за групата „$1“ е неважечки.",
+       "userrights-expiry-in-past": "Истекот за групата „$1“ е во минатото.",
+       "userrights-cannot-shorten-expiry": "Не можете да го поместити нанапред истекот на групата „$1“. Ова можат да го прават само корисници со дозвола за додавање или одземање на оваа група.",
        "userrights-conflict": "Спротиставеност во измените на корисничките права. Прегледајте ги и потврдете ги.",
        "group": "Група:",
        "group-user": "Корисници",
        "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-feedbacklink": "Дајте мислење за новите (бета) филтри",
+       "rcfilters-highlightbutton-title": "Истакнување на исход",
+       "rcfilters-highlightmenu-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 ситни промени",
        "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 не е дозволено, бидејќи со нив можат да се заобиколуваат безбедносните ограничувања.",
        "uncategorizedcategories": "Некатегоризирани категории",
        "uncategorizedimages": "Некатегоризирани податотеки",
        "uncategorizedtemplates": "Некатегоризирани преуредувања",
+       "uncategorized-categories-exceptionlist": " # Содржи список на категории кои не треба да се споменуваат во Special:UncategorizedCategories. По една во секој нов ред што почнува со „*“. Редовите што почнуваат со друг знак (заклучно со празни места) ќе се занемарат. Користете „#“ за прибелешки.",
        "unusedcategories": "Неискористени категории",
        "unusedimages": "Неискористени слики",
        "wantedcategories": "Потребни категории",
        "wantedpages": "Потребни страници",
        "wantedpages-summary": "Список на непостоечки страници со највеќе врски што водат до нив, исклучувајќи страниците до кои водат само пренасочувања. Список на непостоечки страници до кои водат пренасочувања ќе најдете на [[{{#special:BrokenRedirects}}|списокот на прекинати пренасочувања]].",
-       "wantedpages-badtitle": "Ð\9dевалиден Ð½Ð°Ñ\81лов Ð²Ð¾ Ñ\80езÑ\83лÑ\82аÑ\82ите: $1",
+       "wantedpages-badtitle": "Ð\9dеважеÑ\87ки Ð½Ð°Ñ\81лов Ð²Ð¾ Ñ\81Ñ\82авките: $1",
        "wantedfiles": "Потребни податотеки",
        "wantedfiletext-cat": "Следниве податотеки се користат, но не постојат. Податотеките од други складишта може да се наведени дури и ако постојат. Таквите ќе бидат <del>поништени</del> од списокот. Покрај ова, страниците што содржат податотеки кои не постојат се наведени на [[:$1]].",
        "wantedfiletext-cat-noforeign": "Следниве податотеки се користат, но не постојат. Покрај ова, страниците што ги содржат непостоечките податотеки се наведени во [[:$1]].",
        "apisandbox-sending-request": "Испраќам барање до извршникот...",
        "apisandbox-loading-results": "Добивам исход од извршникот...",
        "apisandbox-results-error": "Се појави грешка при вчитувањето на одговорот од барањето до извршникот: $1.",
-       "apisandbox-request-params-json": "JSON-параметри:",
+       "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“.",
        "emailccsubject": "Копија од вашата порака до $1: $2",
        "emailsent": "Писмото е испратено",
        "emailsenttext": "Писмото е испратено.",
-       "emailuserfooter": "$1 го испрати писмово на {{GENDER:$2|$2}} со помош на функцијата „{{int:emailuser}}“ на {{SITENAME}}. {{GENDER:$2|Вашата}} е-пошта ќе му биде испратена право на {{GENDER:$1|изворниот испраќач}}, откривајќи {{GENDER:$1|му}} ја {{GENDER:$2|вашата}} адреса.",
+       "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:КорисникПорака",
        "editcomment": "Коментарот на уредувањето беше: <em>$1</em>.",
        "revertpage": "Отстрането уредувањето на [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]), вратено на последната верзија на [[User:$1|$1]]",
        "revertpage-nouser": "Вратени уредувања од скриен корисник на последната преработка на {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Откажани уредувањата на $1; вратено на последната верзија на $2.",
+       "rollback-success": "Откажани уредувањата на {{GENDER:$3|$1}};; вратено на последната верзија на {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Откажани уредувањата на $1;\nвратено на последната преработка на $2. [$3 Пок. промени]",
        "sessionfailure-title": "Седницата не успеа",
        "sessionfailure": "Има проблем со вашата седница;\nоваа дејство е откажано како превентива против преземање седници.\nПритиснете го копчето „назад“ и повторно вчитајте ја страницата од која дојдовте и обидете се повторно.",
        "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": "Не можете да блокирате или одблокирате други корисници бидејќи и самите сте блокирани",
        "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]]",
        "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-external-bug-report-button": "Поднеси техничка задача",
        "feedback-dialog-title": "Поднеси мислење",
        "feedback-dialog-intro": "Послужете се со едноставниот образец подолу за да го поднесете вашето мислење. Коментарот ќе ви биде додаден на страницата „$1“, заедно со вашето корисничко име.",
-       "feedback-error1": "Грешка: Непрепознаен резултат од извршникот",
+       "feedback-error1": "Грешка: Непрепознаен исход од извршникот",
        "feedback-error2": "Грешка: Уредувањето не успеа",
        "feedback-error3": "Грешка: Извршникот не одговара",
        "feedback-error4": "Грешка: Не можам да објавам под дадениот наслов",
        "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-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 часа}}",
        "expand_templates_html_output": "Сиров HTML-извод",
        "expand_templates_ok": "ОК",
        "expand_templates_remove_comments": "Отстрани коментари",
-       "expand_templates_remove_nowiki": "Притаи <nowiki> ознаки во резултатот",
+       "expand_templates_remove_nowiki": "Притаи <nowiki> ознаки во исходот",
        "expand_templates_generate_xml": "Прикажи XML-дрво на расчленувањето",
        "expand_templates_generate_rawhtml": "Прикажувај сиров HTML",
        "expand_templates_preview": "Преглед",
        "pagelang-language": "Јазик",
        "pagelang-use-default": "Користи стандарден јазик",
        "pagelang-select-lang": "Одберете јазик",
+       "pagelang-reason": "Причина",
        "pagelang-submit": "Поднеси",
        "pagelang-nonexistent-page": "Страницата $1 не постои.",
        "pagelang-unchanged-language": "Страницата $1 е веќе наместена на јазикот $2.",
        "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": "седници со колачиња",
        "usercssispublic": "Напомена: потстраниците со CSS не треба да содржат дсоверливи податоци бидејќи истите се видливи и за други корисници.",
        "restrictionsfield-badip": "Неважечки IP-дијапазон на адреси: $1",
        "restrictionsfield-label": "Допуштени IP-опсези:",
-       "restrictionsfield-help": "Една IP-адреса или CIDR-опсег по ред. За да овозможите сè, користете<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "Една IP-адреса или CIDR-опсег по ред. За да овозможите сè, користете<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
        "revid": "преработка $1",
        "pageid": "назнака на страницата $1"
 }
index cbb7d06..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 e1d1b38..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": "नेहमी",
        "tagline": "{{SITENAME}} कडून",
        "help": "साहाय्य",
        "search": "शोधा",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# The syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "शोधा",
        "go": "चला",
        "searcharticle": "जा",
        "history": "पानाचा इतिहास",
        "history_short": "इतिहास",
+       "history_small": "इतिहास",
        "updatedmarker": "माझ्या शेवटच्या भेटीनंतर अद्यतन केले",
        "printableversion": "छापण्यायोग्य आवृत्ती",
        "permalink": "शाश्वत दुवा",
        "talk": "चर्चा",
        "views": "दृष्ये",
        "toolbox": "साधने",
+       "tool-link-userrights": "{{GENDER:$1|वापरकर्ता}} गट बदला",
        "tool-link-emailuser": "{{GENDER:$1|सदस्याला}} विपत्र पाठवा",
        "userpage": "सदस्य पृष्ठ",
        "projectpage": "प्रकल्प पान पहा",
        "password-change-forbidden": "तुम्ही या विकिवर तुमचा परवलीचा शब्द बदलू शकत नाही.",
        "externaldberror": "विदागार ’खातरजमा’ (प्रमाणितीकरण) त्रुटी होती अथवा तुम्हाला तुमचे बाह्य खाते अद्ययावत  करण्याची परवानगी नाही.",
        "login": "सनोंद-प्रवेश(लॉग-ईन)",
+       "login-security": "तुमची ओळख पटवा",
        "nav-login-createaccount": "सनोंद-प्रवेश / सदस्यखाते उघडा",
        "userlogin": "सनोंद-प्रवेश करा /सदस्यखाते उघडा",
        "userloginnocreate": "सनोंद-प्रवेश",
        "nocookieslogin": "{{SITENAME}} सदस्यांना सनोंद-प्रवेश देतांना, त्यांच्या स्मृतिशेष (cookies) वापरते.तुम्ही स्मृतिशेष सुविधा अनुपलब्ध ठेवली आहे.स्मृतीशेष सुविधा कृपया उपलब्ध करा आणि सनोंद-प्रवेशासाठी पुन्हा प्रयत्न करा.",
        "nocookiesfornew": "हे सदस्य खाते अस्तित्वात नाही, त्यामुळे आम्ही त्याच्या स्रोताची खात्री करू शकलो नाही.\nतुमचे स्मृतिशेष उपलब्ध असण्याची खात्री करा,या पानास पुनर्भारण(रिलोड) करा  किंवा पुन्हा प्रयत्न करा.",
        "noname": "आपण वैध सदस्यनाम नमूद केले नाही.",
-       "loginsuccesstitle": "à¤\86पलà¥\8dया à¤¸à¤¨à¥\8bà¤\82द-पà¥\8dरवà¥\87शाà¤\9aà¥\80 à¤¨à¥\8bà¤\82दणà¥\80 à¤¯à¤¶à¤¸à¥\8dवà¥\80रà¥\80तà¥\8dया à¤ªà¥\82रà¥\8dण à¤\9dालà¥\80",
+       "loginsuccesstitle": "सनà¥\8bà¤\82द-पà¥\8dरवà¥\87शित",
        "loginsuccess": "'''तुम्ही {{SITENAME}} वर \"$1\" नावाने सनोंद प्रवेशित आहात.'''",
        "nosuchuser": "\"$1\" या नावाचा कोणताही सदस्य नाही.तुमचे शुद्धलेखन तपासा, किंवा [[Special:CreateAccount|नवीन खाते]] तयार करा.",
        "nosuchusershort": "\"$1\" या नावाचा सदस्य नाही. लिहीताना आपली चूक तर नाही ना झाली?",
        "newpassword": "नवीन परवलीचा शब्द:",
        "retypenew": "पुन्हा एकदा परवलीचा शब्द टंका:",
        "resetpass_submit": "परवलीचा शब्द टाका आणि सनोंद-प्रवेश करा",
-       "changepassword-success": "तà¥\81मà¤\9aा à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤¯à¤¶à¤¸à¥\8dवà¥\80रितà¥\8dया à¤¬à¤¦à¤²à¤²à¥\87ला à¤\86हà¥\87!",
+       "changepassword-success": "तुमचा परवलीचा शब्द बदललेला आहे!",
        "changepassword-throttled": "तुम्ही नुकतेच सनोंद- प्रवेशासाठी अनेकानेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
        "botpasswords": "सांगकाम्याचे परवलीचे शब्द",
        "botpasswords-summary": "<em>सांगकाम्याचे परवलीचे शब्द</em>हे त्या खात्याची मुख्य सनोंद-प्रवेश अधिकारपत्रे न वापरता, एपीआय मार्फत, सदस्य खात्याच्या प्रवेशास पोहोच देतात.सांगकाम्याचा परवलीचा शब्द वापरुन सनोंद प्रवेश केलेल्यांचे उपलब्ध सदस्य अधिकार प्रतिबंधित असू शकतात.\n\nजर आपणास कळत नसेल आपण हे कां करीत आहोत,तर आपण ते बहुतेक करावयास नको.कोणीही आपणास असे कधीही सांगु नये कि यापैकी एखादे उत्पादित करा व त्यांना द्या.",
        "watchthis": "या लेखावर लक्ष ठेवा",
        "savearticle": "हा लेख साठवा",
        "savechanges": "बदल जतन करा",
+       "publishpage": "पानाचे प्रकाशन करा",
        "publishchanges": "बदल प्रकाशित करा",
        "preview": "झलक",
        "showpreview": "झलक दाखवा",
        "saveprefs": "जतन करा",
        "restoreprefs": "सर्व अविचल(डिफॉल्ट) मांडणी पूर्ववत करा (सर्व विभागात)",
        "prefs-editing": "संपादन",
-       "rows": "ओळी:",
-       "columns": "स्तंभ:",
        "searchresultshead": "शोध",
        "stub-threshold": "रिकाम्या पानाच्या दुव्याची अध:सीमा (Threshold) ($1):",
        "stub-threshold-sample-link": "नमुना",
        "right-changetags": "वैयक्तिक आवृत्त्यांना व नोंद प्रवेष्ट्यांना, आहेतुक(arbitrary) [[Special:Tags|खूणपताका]] जोडा अथवा हटवा",
        "grant-generic": "\"$1\" अधिकार गठ्ठा",
        "grant-group-email": "विपत्र पाठवा",
-       "grant-blockusers": "सदसà¥\8dयाà¤\82ना à¤ªà¥\8dरतिबà¤\82धन/अप्रतिबंधित करा",
+       "grant-blockusers": "सदसà¥\8dयाà¤\82ना à¤ªà¥\8dरतिबà¤\82धित/अप्रतिबंधित करा",
        "grant-createaccount": "खाते तयार करा",
        "grant-createeditmovepage": "पाने बनवा,संपादा व स्थानांतरण करा",
        "grant-delete": "पाने, आवृत्त्या व नोंदी वगळा",
        "grant-editinterface": "मिडियाविकि नामविश्व व सदस्यांची CSS/JS संपादा",
-       "grant-editmycssjs": "à¤\86पलà¥\87 सदस्य CSS/JavaScript संपादित करा",
+       "grant-editmycssjs": "à¤\86पलà¥\80 सदस्य CSS/JavaScript संपादित करा",
        "grant-editmyoptions": "आपला सदस्य पसंतीक्रम संपादा",
        "grant-editmywatchlist": "आपली निरीक्षणयादी संपादित करा",
        "grant-editpage": "अस्तित्वात असलेली पाने संपादा",
        "grant-highvolume": "अत्त्युच्च-जागा घेणारे संपादन",
        "grant-oversight": "सदस्य लपवा व आवृत्त्या दाबा",
        "grant-patrol": "पानांच्या बदलांवर गस्त घाला",
+       "grant-privateinfo": "वैयक्तिक माहिती बघा",
        "grant-protect": "पाने सुरक्षित किंवा असुरक्षित करा",
-       "grant-rollback": "पानाचे बदल परतवा",
+       "grant-rollback": "पानाà¤\82à¤\9aà¥\87 à¤¬à¤¦à¤² à¤ªà¤°à¤¤à¤µà¤¾",
        "grant-sendemail": "इतर सदस्यांना विपत्र पाठवा",
+       "grant-uploadeditmovefile": "संचिकांचे अपभारण, बदल व स्थानांतरण करा",
+       "grant-uploadfile": "नविन संचिका चढवा",
        "grant-basic": "मूळ अधिकार",
        "grant-viewdeleted": "वगळलेल्या संचिका व पाने बघा",
        "grant-viewmywatchlist": "आपली निरीक्षणसूची बघा",
+       "grant-viewrestrictedlogs": "प्रतिबंधित लॉग नोंदी बघा",
        "newuserlogpage": "नवीन सदस्यांची नोंद",
        "newuserlogpagetext": "ही नवीन सदस्यांची नोंद यादी आहे.",
        "rightslog": "सदस्य आधिकार नोंद",
        "action-upload_by_url": "यूआरएल वरुन संचिकेचे अपभारण करा",
        "action-writeapi": "लेखन एपीआय वापरा",
        "action-delete": "हे पान वगळा",
-       "action-deleterevision": "हे आवर्तन वगळा",
-       "action-deletedhistory": "या पानाचा वगळलेला इतिहास पहा",
+       "action-deleterevision": "आवर्तने वगळा",
+       "action-deletelogentry": "लॉग प्रविष्ट्या वगळा",
+       "action-deletedhistory": "एखाद्या पानाचा वगळलेला इतिहास पहा",
+       "action-deletedtext": "वगळलेल्या आवृत्तीतील मजकूर बघा",
        "action-browsearchive": "वगळलेली पाने शोधा",
-       "action-undelete": "वà¤\97ळà¥\8dलà¥\87लà¥\87 à¤ªà¥\83षà¥\8dठ पुनर्स्थापित करा",
-       "action-suppressrevision": "लपलà¥\87लà¥\87 à¤ªà¥\81नरावरà¥\8dतन à¤ªà¤¹à¤¾ à¤µ à¤¸à¤¦à¥\8dयसà¥\8dथितà¥\80त à¤\86णा",
+       "action-undelete": "वà¤\97ळà¥\8dलà¥\87लà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\80 पुनर्स्थापित करा",
+       "action-suppressrevision": "लपविलà¥\87लà¥\8dया à¤\86वà¥\83तà¥\8dतà¥\8dया à¤ªà¤¹à¤¾ à¤µ à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रा",
        "action-suppressionlog": "ही खासगी नोंद पहा",
        "action-block": "या सदस्यास संपादन करण्यापासून प्रतिबंधित करा",
        "action-protect": "या पानाचा सुरक्षास्तर बदला",
        "action-userrights-interwiki": "इतर विकिंवरच्या सदस्यांचे अधिकार संपादित करा",
        "action-siteadmin": "माहितीसाठ्याला कुलूप लावा अथवा काढा",
        "action-sendemail": "विपत्रे (ई-मेल्स) पाठवा.",
+       "action-editmyoptions": "आपल्या स्वत:चा 'पसंतीक्रम' संपादा",
        "action-editmywatchlist": "'माझी निरीक्षणसूची' संपादा",
        "action-viewmywatchlist": "'माझी निरीक्षणसूची' बघा",
        "action-viewmyprivateinfo": "आपली वैयक्तिक माहिती बघा",
        "action-editmyprivateinfo": "आपली वैयक्तिक माहिती संपादा",
        "action-editcontentmodel": "पानाचा आशय नमूना संपादा",
-       "action-managechangetags": "डाà¤\9fाबà¥\87समधà¥\8dयà¥\87 à¤\96à¥\82णपतà¤\95ा à¤¤à¤¯à¤¾à¤° à¤\95रा à¤\95िà¤\82वा à¤µà¤\97ळा",
+       "action-managechangetags": "à¤\96à¥\82णपताà¤\95ा à¤¤à¤¯à¤¾à¤° à¤\95रा à¤\95िà¤\82वा (à¤\85)सà¤\95à¥\8dरिय à¤\95रा",
        "action-applychangetags": "आपल्या बदलांसोबतच खूणपताका जोडा",
        "action-changetags": "वैयक्तिक आवृत्त्यांना व नोंद प्रवेष्ट्यांना, आहेतुक(arbitrary) खूणपताका जोडा अथवा हटवा",
+       "action-deletechangetags": "डाटाबेसमधून खूणपताका वगळा",
+       "action-purge": "या पानास तरोताजे (पर्ज) करा",
        "nchanges": "$1 {{PLURAL:$1|बदल}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|मागील भेटीनंतर}}",
        "enhancedrc-history": "इतिहास",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "recentchanges-submit": "दाखवा",
+       "rcfilters-activefilters": "सक्रिय गाळण्या",
+       "rcfilters-search-placeholder": "अलीकडील बदल गाळा (न्याहाळा किंवा टंकन सुरू करा)",
+       "rcfilters-invalid-filter": "अवैध गाळणी",
+       "rcfilters-filterlist-title": "गाळण्या",
+       "rcfilters-filterlist-noresults": "कोणतीच गाळणी सापडली नाही",
+       "rcfilters-filtergroup-registration": "सदस्य नोंदणी",
+       "rcfilters-filter-registered-label": "नोंदणीकृत",
+       "rcfilters-filter-registered-description": "प्रवेशलेले सदस्य",
+       "rcfilters-filter-unregistered-label": "अ-नोंदणीकृत",
+       "rcfilters-filter-unregistered-description": "संपादक जे प्रवेशित नाहीत.",
+       "rcfilters-filtergroup-authorship": "संपादनाचा लेखक",
+       "rcfilters-filter-editsbyself-label": "आपली स्वत:ची संपादने",
+       "rcfilters-filter-editsbyself-description": "आपली संपादने",
+       "rcfilters-filter-editsbyother-label": "इतरांची संपादने",
+       "rcfilters-filter-editsbyother-description": "इतर सदस्यांनी तयार केलेली संपादने (आपण नाही).",
+       "rcfilters-filtergroup-userExpLevel": "अनुभवाचा स्तर (फक्त नोंदणीकृत सदस्यांसाठीच)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "नवागत",
+       "rcfilters-filter-userExpLevel-newcomer-description": "१० संपादनांपेक्षा कमी व ४ दिवसांची सक्रियता.",
+       "rcfilters-filter-userExpLevel-learner-label": "शिकाऊ",
        "rcnotefrom": "खाली {{PLURAL:$5|हा बदल आहे|हे बदल आहेत}} <strong>$3, $4</strong>पासून ते(<strong>$1</strong>पर्यंतचे  बदल दाखविले आहेत).",
        "rclistfrom": "$2,$3 पासून सुरुवात करुन, नविन केल्या गेलेले बदल दाखवा.",
        "rcshowhideminor": "छोटे बदल $1",
        "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": "शोधा",
        "created": "तयार केले",
        "changed": "बदलले",
        "deletepage": "पान वगळा",
-       "confirm": "निश्चीत",
+       "confirm": "निश्चीत करा",
        "excontent": "मजकूर होता: '$1'",
        "excontentauthor": "मजकूर होता: \"$1\" आणि फक्त [[Special:Contributions/$2|$2]]  ([[User talk:$2|चर्चा]])यांचेच योगदान होते.",
        "exbeforeblank": "वगळण्यापूर्वीचा मजकूर पुढीलप्रमाणे: '$1'",
        "modifiedarticleprotection": "\"[[$1]]\"करिता सुरक्षापातळी बदलली",
        "unprotectedarticle": "\"[[$1]]\" असुरक्षित केला.",
        "movedarticleprotection": "सुरक्षापातळी \"[[$2]]\" येथून \"[[$1]]\" येथे हलवली.",
+       "protectedarticle-comment": "\"[[$1]]\" ला {{GENDER:$2|ने संरक्षित केले}}",
+       "modifiedarticleprotection-comment": "\"[[$1]]\" ची {{GENDER:$2| ने संरक्षण पातळी बदलली}}",
+       "unprotectedarticle-comment": "\"[[$1]]\" ची {{GENDER:$2| ने सुरक्षा हटविली}}",
        "protect-title": "\"$1\" सुरक्षित करत आहे",
        "protect-title-notallowed": "\"$1\" ची सुरक्षा पातळी पहा",
        "prot_1movedto2": "\"[[$1]]\" हे पान \"[[$2]]\" मथळ्याखाली स्थानांतरित केले.",
        "pageinfo-display-title": "दृश्य शीर्षक",
        "pageinfo-default-sort": "डिफॉल्ट निवड-कळ (सॉर्ट कि)",
        "pageinfo-length": "पानाचा आकार (बाइट्समध्ये)",
-       "pageinfo-article-id": "पà¥\83षà¥\8dठ-परिà¤\9aय",
-       "pageinfo-language": "पानाच्या मजकूराची भाषा",
-       "pageinfo-content-model": "पान आशय नमूना",
+       "pageinfo-article-id": "पà¥\83षà¥\8dठ-à¤\93ळà¤\96ण",
+       "pageinfo-language": "पान-आशय भाषा",
+       "pageinfo-content-model": "पान-आशय नमूना",
        "pageinfo-content-model-change": "बदला",
-       "pageinfo-robot-policy": "यà¤\82तà¥\8dरमानवादà¥\8dवारà¥\87 à¤\85नà¥\81à¤\95à¥\8dरमन",
+       "pageinfo-robot-policy": "यà¤\82तà¥\8dरमानवाà¤\82दà¥\8dवारà¥\87 à¤\85नà¥\81à¤\95à¥\8dरमण",
        "pageinfo-robot-index": "अनुमती दिली",
        "pageinfo-robot-noindex": "अनुमती दिल्या जात नाही",
        "pageinfo-watchers": "पानावर पहारा देणाऱ्यांची संख्या",
+       "pageinfo-visiting-watchers": "या पानात झालेल्या अलीकडील संपादनांना पहारा देणाऱ्यांची संख्या",
        "pageinfo-few-watchers": "$1 पेक्षा कमी {{PLURAL:$1|पहारेदार}}",
        "pageinfo-redirects-name": "या पानास असलेली  पुनर्निर्देशनांची संख्या",
-       "pageinfo-subpages-name": "या à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87 à¤\89प-पान",
+       "pageinfo-subpages-name": "या à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 à¤\89प-पानà¥\87",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|पुनर्निर्देशन|पुनर्निर्देशने}}; $3 {{PLURAL:$3|अ-पुनर्निर्देशन|अ-पुनर्निर्देशने}})",
-       "pageinfo-firstuser": "पà¥\83षà¥\8dठ à¤¨à¤¿à¤°à¥\8dमानक",
+       "pageinfo-firstuser": "पà¥\83षà¥\8dठ à¤¨à¤¿à¤°à¥\8dमाणक",
        "pageinfo-firsttime": "पान निर्मितीचा दिनांक",
        "pageinfo-lastuser": "अलीकडील संपादक",
        "pageinfo-lasttime": "अलीकडिल संपादनाचा दिनांक",
        "pageinfo-edits": "एकूण संपादने",
        "pageinfo-authors": "सुस्पष्ट-लेखकांची एकुण संख्या",
-       "pageinfo-recent-edits": "सध्याची संपादनसंख्या (मागील $1 मध्ये)",
+       "pageinfo-recent-edits": "सध्याची संपादनसंख्या (मागील $1)",
        "pageinfo-recent-authors": "सुस्पष्ट लेखकांची सध्या असलेली संख्या",
        "pageinfo-magic-words": "जादुई {{PLURAL:$1|शब्द}} ($1)",
        "pageinfo-hidden-categories": "लपविलेले {{PLURAL:$1|वर्ग}} ($1)",
        "pageinfo-category-pages": "पानांची संख्या",
        "pageinfo-category-subcats": "उपवर्गांची संख्या",
        "pageinfo-category-files": "संचिकांची संख्या",
+       "pageinfo-user-id": "सदस्य ओळखण",
        "markaspatrolleddiff": "टेहळणी केल्याची खूण करा",
        "markaspatrolledtext": "या पानावर गस्त झाल्याची खूण करा",
        "markaspatrolledtext-file": "या संचिकेच्या आवृत्तीस गस्त घातली म्हणून् खूण करा",
        "watchlistedit-raw-done": "तुमची पहाऱ्याची सूची परिष्कृत करण्यात आली आहे.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 शीर्षक होते |$1 शीर्षक होती }} भर घातली:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 शीर्षक होते |$1 शीर्षक होती }} वगळले:",
-       "watchlistedit-clear-title": "निरà¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80 à¤¸à¤¾à¤« à¤\95à¥\87लà¥\80",
+       "watchlistedit-clear-title": "निरà¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80 à¤¸à¤¾à¤« à¤\95रा",
        "watchlistedit-clear-legend": "निरीक्षणसूची साफ करा",
-       "watchlistedit-clear-explain": "à¤\86पलà¥\8dया à¤¨à¤¨à¤¿à¤°à¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80तà¥\80ल à¤¸à¤°à¥\8dव à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤¹à¤\9fविलà¥\8dया à¤\9cातà¥\80ल.",
+       "watchlistedit-clear-explain": "आपल्या निरीक्षणसूचीतील सर्व शिर्षक हटविल्या जातील.",
        "watchlistedit-clear-titles": "शिर्षके:",
        "watchlistedit-clear-submit": "निरीक्षणसूची साफ करा(हे कायमस्वरुपी आहे!)",
        "watchlistedit-clear-done": "तुमची पहाऱ्याची सूची स्वच्छ करण्यात आली आहे.",
        "feedback-useragent": "सदस्य प्रतिनीधी:",
        "searchsuggest-search": "शोधा {{SITENAME}}",
        "searchsuggest-containing": ".......हे असलेले",
-       "api-error-badaccess-groups": "आपणास ह्या विकिवर संचिका चढवण्याची परवानगी नाही",
        "api-error-badtoken": "अंतर्गत चूक: अयोग्य टोकन",
-       "api-error-copyuploaddisabled": "या विदागारावर 'संकेतस्थळावरील संचिका चढविणे' अक्षम करण्यात आले आहे.",
-       "api-error-duplicate": "{{PLURAL:$1|दुसरी संचिका|दुसऱ्या इतर संचिका}}ही याच नावाने व याच आशयासह संकेतस्थळावर आहेत.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|दुसरी संचिका|दुसऱ्या इतर संचिका}}ही याच नावाने व याच आशयासह संकेतस्थळावर आहे परंतु{{PLURAL:$1|ते वगळल्या गेले|ती वगळल्या गेलीत}}",
-       "api-error-empty-file": "तुम्ही प्रस्तुत केलेली संचिका रिकामी होती.",
        "api-error-emptypage": "नवीन आणि मोकळी पाने बनवायला परवानगी नाही",
-       "api-error-fetchfileerror": "अंतर्गत चूक: फाइल मिळवतांना काहीतरी चूक झाली आहे",
-       "api-error-fileexists-forbidden": "\"$1\" या नावाची संचिका पूर्वीच उपलब्ध आहे व त्यावर पुनर्लेखन करता येऊ शकत नाही.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" या नावाची संचिका, 'सहभागी संचिका भांडारात' पूर्वीच उपलब्ध आहे,व त्यावर पुनर्लेखन करता येऊ शकत नाही.",
-       "api-error-file-too-large": "तुम्ही प्रस्तुत केलेली संचिका आकाराने खूप मोठी होती.",
-       "api-error-filename-tooshort": "संचिकेचे नाव खूपच छोटे आहे.",
-       "api-error-filetype-banned": "याप्रकारची संचिका प्रतिबंधित आहे.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|हा परवानगी नसलेला  संचिका-प्रकार आहे|या परवानगी नसलेल्या संचिका-प्रकार आहेत}}. $2 {{PLURAL:$3|हा परवानगी असलेला संचिका-प्रकार आहे|या परवानगी असलेल्या संचिका-प्रकार आहेत}}.",
-       "api-error-filetype-missing": "या संचिकेस विस्तार(एक्सटेंशन) नाही.",
-       "api-error-hookaborted": "तुम्ही केलेला बदल extension ने उलटवला आहे",
-       "api-error-http": "अंतर्गत त्रुटी: सर्व्हरशी जोडणी होऊ शकली नाही.",
-       "api-error-illegal-filename": "हे संचिकानाम प्रतिबंधित आहे.",
-       "api-error-internal-error": "अंतर्गत त्रुटी:आपण विकिवर चढविलेल्या संचिकेवर प्रक्रिया करतांना काहीतरी चुकले आहे.",
-       "api-error-invalid-file-key": "अंतर्गत त्रुटी: तात्पुरत्या साठवणीत संचिका सापडली नाही.",
-       "api-error-missingparam": "अंतर्गत चूक: मागणीतील काही नोंदी राहून गेल्या आहेत",
-       "api-error-missingresult": "आंतरिक त्रुटी : प्रत यशस्वी झाली की नाही हे ठरवता  येत नाही",
-       "api-error-mustbeloggedin": "संचिका चढविण्यासाठी आपण दाखल होणे जरुरी आहे.",
-       "api-error-mustbeposted": "अंतर्गत चूक: मागणी पूर्ण करण्यासाठी HTTP POST असायला हवे",
-       "api-error-noimageinfo": "डाटा अपलोड यशस्वी झाले आहे पण सर्व्हर कडून तशी माहिती अजून मिळाली नाही",
-       "api-error-nomodule": "अंतर्गत चूक: module set चढवलेला नाही",
-       "api-error-ok-but-empty": "आंतरिक त्रुटी : विदादाता प्रतिक्रिया देत नहीं",
-       "api-error-overwrite": "अस्तित्वात असलेल्या संचिकेवर पुनर्लेखन प्रतिबंधित आहे.",
-       "api-error-ratelimited": "आपण, हा विकी परवानगी देत असल्यापेक्षा अधिक संचिका, कमी कालावधीत अपभारणाचा प्रयत्न करीत आहात.\nकाही मिनिटांनी पुन्हा प्रयत्न करा.",
-       "api-error-stashfailed": "इन्तरिक त्रुटी : विदादाता तात्पुरत्या स्वरूपाच्या संचिका जमा करण्यात अयशस्वी",
        "api-error-publishfailed": "अंतर्गत त्रुटी:विदादात्यास, या तात्पुरत्या संचिकेच्या प्रकाशनास अपयश आले.",
-       "api-error-stasherror": "स्टॅचमध्ये ही संचिका अपभारणात त्रुटी आली.",
-       "api-error-timeout": "अपेक्षित वेळेत विदागार (server)ने प्रतिसाद दिला नाही.",
-       "api-error-unclassified": "एक अज्ञात चूक उद्भवली.",
-       "api-error-unknown-code": "अज्ञात त्रुटी: \"$1\"",
-       "api-error-unknown-error": "अंतर्गत त्रुटी:आपली संचिका चढवितांना काहीतरी चुकले आहे.",
+       "api-error-stashfailed": "इन्तरिक त्रुटी : विदादाता तात्पुरत्या स्वरूपाच्या संचिका जमा करण्यात अयशस्वी",
        "api-error-unknown-warning": "अज्ञात इशारा : $1",
        "api-error-unknownerror": "अज्ञात चूक $1",
-       "api-error-uploaddisabled": "चढवण्याचे कार्य ह्या विकिवर अवरुद्ध करण्यात आले आहे",
-       "api-error-verification-error": "ही संचिका भ्रष्ट(करप्ट) झाली किंवा चुकीचा विस्तार(एक्सटेंशन) असलेली असू शकते.",
        "duration-seconds": "$1 {{PLURAL:$1|सेकंदापूर्वी|सेकंदांपूर्वी}}",
        "duration-minutes": "$1 {{PLURAL:$1|मिनिटापूर्वी|मिनिटांपूर्वी}}",
        "duration-hours": "$1 {{PLURAL:$1|तासापूर्वी|तासांपूर्वी}}",
index 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 9eb9458..1555a31 100644 (file)
@@ -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": "ဖျက်​ပါ​",
        "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": "စာမျက်နှာခေါင်းစဉ်ကိုက်ညီသည်",
        "searchall": "အားလုံး",
        "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": "လတ်တလောအပြောင်းအလဲများကို ပြရန်နေ့များ -",
        "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-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> အထိ ပြထား)။",
        "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": "တည်းဖြတ်ထားဖူးသော အသုံးပြုသူများကိုသာ ဖော်ပြရန်",
        "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 အတွက် အသုံးပြုသူ၏ ဆောင်ရွက်ချက်များ",
        "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": "ထည့်သွင်းကူးယူချက်",
        "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 ဝင်ရန်/ အကောင့် ဖန်တီးရန်",
        "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 တင်ခဲ့သည်}}",
        "rightsnone": "(ဘာမှမရှိ)",
        "revdelete-summary": "အကျဉ်းချုပ်ကို တည်းဖြတ်ရန်",
        "searchsuggest-search": "{{SITENAME}} တွင် ရှာဖွေရန်",
-       "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\"",
        "api-error-unknown-warning": "အမည်မသိ သတိပေးချက် - $1",
-       "api-error-uploaddisabled": "ဤဝီကီတွင် ဖိုင်တင်ခြင်း ပိတ်ထားသည်။",
-       "api-error-verification-error": "ဖိုင်ပျက်နေသည် (သို့) ဖိုင်နောက်ဆက် extension မှားနေသည်။",
        "pagelanguage": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်",
+       "pagelang-name": "စာမျက်နှာ",
        "pagelang-language": "ဘာသာစကား",
        "pagelang-use-default": "ပင်မ ဘာသာစကားကို အသုံးပြုရန်",
        "right-pagelang": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်",
index 58efd6f..ecff7b5 100644 (file)
@@ -15,7 +15,7 @@
                        "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",
        "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": "{{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": "Itechcopa",
        "prefs-resetpass": "Ticpatlāz motlahtōlichtacāyo",
        "saveprefs": "Xicpiya",
        "prefs-editing": "Tlapatlaliztli",
-       "rows": "Pāntli:",
        "searchresultshead": "Tlatemoliztli",
        "recentchangesdays": "Tōnaltin tiquinttāz yancuīc tlapatlalizpan:",
        "localtime": "Cāhuitl nicān:",
        "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}}",
+       "ncategories": "$1 {{PLURAL:$1|neneuhcayotl|neneuhcayomeh}",
        "nlinks": "$1 {{PLURAL:$1|tzohuililiztli|tzohuililiztin}}",
        "nmembers": "$1 {{PLURAL:$1|tlahcuilolamatl|tlahcuilolamameh}}",
        "nrevisions": "$1 {{PLURAL:$1|tlapiyaliztli}}",
        "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": "Cayecualli",
        "expand_templates_preview": "Xiquitta achtochīhualiztli",
        "special-characters-group-latin": "Latintlahcuilolli",
index 3d79d8c..ef4d79c 100644 (file)
        "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ō·",
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 a87227a..445a36e 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",
        "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* Blokaden startet: $8\n* Blokaden gjelder til: $6\n* Blokaden er ment for: $7\n\nDin nåværende IP-adresse er $3.\nVennligst inkluder informasjonen over i alle spørsmål du spør angående dette.",
+       "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",
        "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",
        "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:",
        "editusergroup": "Last brukergrupper",
        "editinguser": "Endrer brukerrettighetene for {{GENDER:$1|bruker}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Viser {{GENDER:$1|brukerrettighetene}} til  <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Rediger brukergrupper",
-       "userrights-viewusergroup": "Se brukergrupper",
+       "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-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.",
        "group": "Gruppe:",
        "group-user": "Brukere",
        "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-feedbacklink": "Gi tilbakemelding på de nye (beta)filtrene",
+       "rcfilters-highlightbutton-title": "Marker resultater",
+       "rcfilters-highlightmenu-title": "Velg en farge",
        "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-params-json": "JSON-parametre:",
+       "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.",
        "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}}. {{GENDER:$2|Din}} epost vil bli sendt direkte til {{GENDER:$1|opprinnelig avsender}} og avsløre {{GENDER:$2|din}} epost-addresse til {{GENDER:$1|dem}}.",
+       "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",
        "editcomment": "Redigeringskommentaren var: <em>$1</em>",
        "revertpage": "Tilbakestilte endringer av [[Special:Contributions/$2|$2]] ([[User talk:$2|brukerdiskusjon]]) til siste versjon av [[User:$1|$1]]",
        "revertpage-nouser": "Tilbakestilt endringer av skjult bruker til siste versjon av\n{{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Tilbakestilte endringer av $1; endret til siste versjon av $2.",
+       "rollback-success": "Tilbakestilte endringer av {{GENDER:$3|$1}}; endret til siste versjon av {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Tilbakestilte endringer av $1;\nendret tilbake til siste revisjon av $2. [$3 Vis endringer]",
        "sessionfailure-title": "Sesjonsfeil",
        "sessionfailure": "Det ser ut til å være et problem med innloggingen din, og den ble avbrutt av sikkerhetshensyn. Trykk ''Tilbake'' i nettleseren din, oppdater siden og prøv igjen.",
        "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",
        "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",
        "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 tjeneren 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": "Tjeneren 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-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.",
        "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",
        "usercssispublic": "Merk: CSS-undersidene bør ikke inneholde konfidensielle data siden de kan ses av andre brukere.",
        "restrictionsfield-badip": "Ugyldig IP-adresse eller intervall: $1",
        "restrictionsfield-label": "Tillatte IP-intervaller:",
-       "restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk <br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
+       "restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk: <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisjon $1",
        "pageid": "side-ID $1"
 }
index f5f497e..bc84842 100644 (file)
        "viewpagelogs": "यस पृष्ठका लगहरू हेर्नुहोस्",
        "nohistory": "यस पृष्ठको लागी कुनै सम्पादन इतिहास छैन।",
        "currentrev": "हालको संस्करण",
-       "currentrev-asof": "$1à¤\95à¥\8b à¤°à¥\81पमा à¤¹à¤¾à¤²à¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81",
+       "currentrev-asof": "$1à¤\95à¥\8b à¤°à¥\81पमा à¤¹à¤¾à¤²à¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82",
        "revisionasof": "$1 जस्तै गरी पुनरावलोकन",
        "revision-info": "{{GENDER:$6|$2}}$7 द्वारा $1को संशोधन",
        "previousrevision": "← पुरानो संशोधन",
        "rev-suppressed-text-view": "यस पृष्ठको पुनरावलोकन <strong>थिचिएको छ</strong>।\nप्रबन्धकको हैसियतले हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को थिचिएको लगमा विवरण पाउन सकिन्छ]",
        "rev-deleted-no-diff": "तपाईंले यसको भिन्नता पाउन सक्नुहुन्न किनभने यस पृष्ठको पुनरावलोकन <strong>मेटाइएको छ</strong>'।\nयसको विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सक्नुहुन्छ]।",
        "rev-suppressed-no-diff": "तपाईं यसको भिन्नता हेर्न सक्नुहुन्न किनभने यसको एउटा संशोधन <strong>मेटाइएको</strong>छ।",
-       "rev-deleted-unhide-diff": "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 मध्ये एउटा भिन्नता <strong>मेटाइएकोछ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रवन्धकको हैसियतले [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
-       "rev-suppressed-unhide-diff": "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 मध्ये एउटा भिन्नता <strong>थिचिएको छ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/suppress|पृष्ठ={{FULLPAGENAMEE}}}}को थिचिएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
+       "rev-deleted-unhide-diff": "यस à¤ªà¥\83षà¥\8dठà¤\95ा à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 मध्ये एउटा भिन्नता <strong>मेटाइएकोछ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रवन्धकको हैसियतले [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
+       "rev-suppressed-unhide-diff": "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 मध्ये एउटा भिन्नता <strong>थिचिएको छ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/suppress|पृष्ठ={{FULLPAGENAMEE}}}}को थिचिएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
        "rev-deleted-diff-view": "यस भिन्नताका संशोधनहरुमध्येको एउटा चाहिं <strong>मेटियो।<strong> \nतपाईंले यस भिन्नतालाई हेर्न सक्नुहुन्छ; सबै विवरण  [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} मेटाइएको लग]मा पाउन सकिनेछ।",
        "rev-suppressed-diff-view": "यस भिन्नताका संशोधनहरुमध्येको एउटा चाहिं  <strong>दबाइयो।<strong> \nतपाईंले यस भिन्नतालाई हेर्न सक्नुहुन्छ; सबै विवरण  [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} दबाइएको लग]मा पाउन सकिनेछ।",
        "rev-delundel": "दृश्यता परिवर्तन गर्ने",
        "rev-showdeleted": "देखाउनुहोस्",
-       "revisiondelete": "मà¥\87à¤\9fाà¤\89नà¥\87/मà¥\87à¤\9fाà¤\8fà¤\95à¥\8b à¤°à¤¦à¥\8dदà¤\97रà¥\8dनà¥\87  à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81",
+       "revisiondelete": "मà¥\87à¤\9fाà¤\89नà¥\87/मà¥\87à¤\9fाà¤\8fà¤\95à¥\8b à¤°à¤¦à¥\8dदà¤\97रà¥\8dनà¥\87  à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82",
        "revdelete-nooldid-title": "अमान्य पुनरावलोकन लक्ष",
        "revdelete-nooldid-text": "यस क्रियालाई गर्नको लागि तपाईंले लक्ष्य अवतरण दिनु भएको छैन, वा तपाईंले दिएको अवतरण अस्तित्वमा छैन वा तपाईं सद्य अवतरणलाई लुकाउने प्रयत्न गर्दै हुनुहुन्छ।",
        "revdelete-no-file": "खुलाइएको पृष्ठ अस्तित्वमा छैन",
        "mergehistory-merge": "[[:$1]]को निम्न अवतरण [[:$2]]मा समाविष्ट गर्न सकिनेछ।\nदिइएको समय वा त्यस भन्दा पहिले भएको अवतरणहरूलाई एकत्रित गर्नका लागि  रेडियो बटनको प्रयोग गर्नुहोस।\nन्याभिगेसन लिङ्कहरूको प्रयोग पछी यो कलम आफ्नो पुरानै स्थितिमा आउनेछ।",
        "mergehistory-go": "जोड्न मिल्ने सम्पादनहरू",
        "mergehistory-submit": "पुनरावलोकहरु जोड्नुहोस्",
-       "mergehistory-empty": "à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 जोड्न मिल्दैन ।",
+       "mergehistory-empty": "à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 जोड्न मिल्दैन ।",
        "mergehistory-done": "$3 {{PLURAL:$3|संस्करण|संस्करणहरू}}  $1बाट सफलतापूर्वक [[:$2]]मा थपियो ।",
        "mergehistory-fail": "इतिहास जोड्न सकिएन कृपया पृष्ठको नाम र समयमान जाँच गर्नुहोस्।",
        "mergehistory-fail-toobig": "इतिहास समाहित गर्न सम्भव छैन किनभने अवतरण सिमा $1 भन्दा बढी {{PLURAL:$1|अवतरण|अवतरणहरू}} लाई स्थानान्तरित गर्नु पर्छ।",
        "difference-multipage": "(पृष्ठहरूमा भिन्नता)",
        "lineno": "पंक्ति $1:",
        "compareselectedversions": "छानिएका संस्करणहरू दाँज्नुहोस्",
-       "showhideselectedversions": "à¤\9bानिà¤\8fà¤\95ा à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 देखाउने/लुकाउने",
+       "showhideselectedversions": "à¤\9bानिà¤\8fà¤\95ा à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 देखाउने/लुकाउने",
        "editundo": "रद्द गर्ने",
        "diff-empty": "(कुनै भिन्नता छैन)",
        "diff-multi-sameuser": "(यस प्रयोगकर्ताद्वारा {{PLURAL:$1|गरिएको बीचको एउटा अवतरण देखाइएन|गरिएको बीचको $1 अवतरण देखाइएन}})",
        "saveprefs": "संग्रह",
        "restoreprefs": "सबै पूर्वनिर्धारित स्थिती कायम गर्ने(सबै खण्डहरूमा)",
        "prefs-editing": "सम्पादन",
-       "rows": "हरफहरू :",
-       "columns": "स्तम्भहरू :",
        "searchresultshead": "खोज",
        "stub-threshold": "<a href=\"#\" class=\"stub\">ठूटो</a> को लागि थ्रेसहोल्ड स्वरूपण (बाइट):",
        "stub-threshold-sample-link": "उदाहरण",
        "userrights-reason": "कारण :",
        "userrights-no-interwiki": "तपाईंलाई अन्य विकिमा प्रयोगकर्ता अधिकार सम्पादन गर्ने अनुमति छैन।",
        "userrights-nodatabase": "डेटाबेस $1 उपलब्ध छैन या स्थानीय हैन।",
-       "userrights-nologin": "प्रयोगकर्ता अधिकार प्रदान गर्न तपाईंले प्रबन्धक खाताबाट [[Special:UserLogin|प्रवेश]] गर्नुपर्छ।",
-       "userrights-notallowed": "प्रयोगकर्तालाई अधिकार प्रदान गर्ने वा हटाउने अनुमति तपाईंलाई छैन।",
        "userrights-changeable-col": "तपाईंले परिवर्तन गर्न सक्ने समूहहरू",
        "userrights-unchangeable-col": "तपाईंले परिवर्तन गर्न नसक्ने समूहहरू",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "प्रयोगकर्ताको अधिकार परिवर्तनमा मतभेद भयो ! कृपया तपाईंको परिवर्तन पुनरावलोकन तथा पुष्टि गर्नुहोस् ।",
-       "userrights-removed-self": "तपाईंले सफलतापूर्वक आफ्नो अधिकारहरूलाई मेटाउनु भयो । त्यस कारण तपाईं अब यो पृष्ठ हेर्न सक्नु हुन्न ।",
        "group": "समूह :",
        "group-user": "प्रयोगकर्ताहरू",
        "group-autoconfirmed": "स्वत निश्चित गरिएका प्रयोगकर्ताहरू",
        "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 0282436..ea443c5 100644 (file)
@@ -82,7 +82,9 @@
                        "MrLeopold",
                        "Hex",
                        "Xxmarijnw",
-                       "Mainframe98"
+                       "Mainframe98",
+                       "QZanden",
+                       "Huhbakker"
                ]
        },
        "tog-underline": "Verwijzingen onderstrepen:",
        "searcharticle": "OK",
        "history": "Geschiedenis",
        "history_short": "Geschiedenis",
+       "history_small": "geschiedenis",
        "updatedmarker": "bewerkt sinds mijn laatste bezoek",
        "printableversion": "Printvriendelijke versie",
        "permalink": "Permanente koppeling",
        "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-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?",
+       "passwordreset-ignored": "Het opnieuw instellen van het wachtwoord niet is afgehandeld. Misschien is er geen provider geconfigureerd?",
        "passwordreset-invalidemail": "Ongeldig e-mailadres",
        "passwordreset-nodata": "Er is geen gebruikersnaam of e-mailadres opgegeven",
        "changeemail": "E-mailadres wijzigen of verwijderen",
        "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.",
        "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",
        "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",
        "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:",
        "editusergroup": "Gebruikersgroepen wijzigen",
        "editinguser": "Bezig met wijzigen van de gebruikersrechten van gebruiker '''[[User:$1|$1]]''' $2",
        "viewinguserrights": "Gebruikersrechten bekijken van {{GENDER:$1|gebruiker}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Gebruikersgroepen wijzigen",
-       "userrights-viewusergroup": "Toon gebruikersgroepen",
+       "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-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.",
        "group": "Groep:",
        "group-user": "gebruikers",
        "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-feedbacklink": "Geef feedback op de nieuwe (beta) filters",
+       "rcfilters-highlightbutton-title": "Resultaten markeren",
+       "rcfilters-highlightmenu-title": "Kies een kleur",
        "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-filtergroup-authorship": "Bewerken auteurschap",
        "rcfilters-filter-editsbyself-label": "Uw eigen bewerkingen",
        "rcfilters-filter-editsbyself-description": "Bewerkingen door u.",
        "rcfilters-filter-editsbyother-label": "Bewerkingen door anderen",
-       "rcfilters-filter-editsbyother-description": "Bewerkingen die gemaakt zijn door andere gebruikers (niet door uzelf.)",
+       "rcfilters-filter-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-params-json": "JSON parameters:",
+       "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.",
        "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 door $1 aan {{GENDER:$2|$2}} {{GENDER:$1|verstuurd}} middels de functie \"{{int:emailuser}}\" van {{SITENAME}}. {{GENDER:$2|Uw}} e-mail wordt direct naar de {{GENDER:$1|oorspronkelijke afzender}} verstuurd, waardoor {{GENDER:$2|uw}} e-mailadres aan {{GENDER:$1|hem|haar|hem of haar}} onthuld wordt.",
+       "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",
        "editcomment": "De bewerkingssamenvatting was: <em>$1</em>.",
        "revertpage": "Wijzigingen door [[Special:Contributions/$2|$2]] ([[User talk:$2|Overleg]]) hersteld tot de laatste versie door [[User:$1|$1]]",
        "revertpage-nouser": "Wijzigingen door een verborgen gebruiker teruggedraaid naar de laatste versie door {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "De wijzigingen door $1 zijn teruggedraaid.\nDe laatste versie van $2 is hersteld.",
+       "rollback-success": "De wijzigingen door {{GENDER:$3|$1}} zijn teruggedraaid.\nDe laatste versie van {{GENDER:$4|$2}} is hersteld.",
        "rollback-success-notify": "De wijzigingen door $1 zijn teruggedraaid;\nde laatste versie van $2 is hersteld. [$3 Wijzigingen weergeven]",
        "sessionfailure-title": "Sessiefout",
        "sessionfailure": "Er lijkt een probleem te zijn met uw aanmeldsessie.\nUw handeling is gestopt uit voorzorg tegen een beveiligingsrisico (dat bestaat uit mogelijke \"hijacking\" van deze sessie).\nGa een pagina terug, laad die pagina opnieuw en probeer het nog eens.",
        "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",
        "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.",
        "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-useragent": "Useragent:",
        "searchsuggest-search": "Doorzoek {{SITENAME}}",
        "searchsuggest-containing": "bevat...",
-       "api-error-autoblocked": "Uw IP-adres is automatisch geblokeerd, omdat het gebruikt is door een geblokkeerde gebruiker.",
-       "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|bestaat al een bestand|bestaan al bestanden}} met dezelfde inhoud op de wiki.",
-       "api-error-duplicate-archive": "Er {{PLURAL:$1|was al een ander bestand|waren al andere bestanden}} op de site met dezelfde inhoud, maar {{PLURAL:$1|deze is|deze 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-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.",
        "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",
        "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-suppress-reblock": "Verbergen van gebruiker tijdens wijzigen blokkade",
        "log-action-filter-upload-upload": "Nieuwe upload",
        "log-action-filter-upload-overwrite": "Herupload",
+       "authmanager-authn-not-in-progress": "Verificatie is niet in uitvoering of de sessiegegevens zijn verloren gegaan. Gelieve opnieuw starten vanaf het begin.",
+       "authmanager-authn-no-primary": "De meegeleverde inloggegevens kunnen niet worden geverifieerd.",
+       "authmanager-authn-no-local-user": "De ingevoerde inloggegevens zijn niet geassocieerd met een gebruiker op deze wiki.",
+       "authmanager-authn-no-local-user-link": "De meegeleverde inloggegevens zijn geldig, maar zijn niet gekoppeld aan enige gebruiker op deze wiki. Log in op een andere manier, of creëer een nieuwe gebruiker, en u heeft een optie om uw eerdere inloggegevens van te koppelen.",
        "authmanager-authn-autocreate-failed": "Het automatisch aanmaken van een lokaal account is mislukt: $1",
+       "authmanager-change-not-supported": "De meegeleverde inloggegevens kunnen niet worden gewijzigd, omdat niets deze zou gebruiken.",
        "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-create-not-in-progress": "Het maken van een account is niet in uitvoering of de sessiegegevens zijn verloren gegaan. Gelieve opnieuw starten vanaf het begin.",
+       "authmanager-create-no-primary": "De meegeleverde inloggegevens kunnen niet worden gebruikt voor het aanmaken van uw account.",
+       "authmanager-link-no-primary": "De meegeleverde inloggegevens kunnen niet worden gebruikt om een account te koppelen.",
+       "authmanager-link-not-in-progress": "Account koppelen is niet gestart of de sessiegegevens zijn verloren gegaan. Gelieve opnieuw starten vanaf het begin.",
        "authmanager-authplugin-setpass-failed-title": "Wachtwoord wijzigen is mislukt",
+       "authmanager-authplugin-setpass-failed-message": "De verificatie-invoegtoepassing heeft het wijzigen van het wachtwoord geweigerd.",
+       "authmanager-authplugin-create-fail": "De verificatie-invoegtoepassing heeft geweigerd uw account aan te maken.",
+       "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-provider-password": "Op wachtwoord gebaseerde authenticatie",
        "authmanager-provider-password-domain": "Wachtwoord- en domeingebaseerde authentificatie",
        "authmanager-provider-temporarypassword": "Tijdelijk wachtwoord",
+       "authprovider-confirmlink-message": "Op basis van uw recente login pogingen, kan het volgende account worden gekoppeld aan uw wiki account. Het koppelen van stelt U in staat in te loggen via deze accounts. Gelieve te selecteren welk account moet worden gekoppeld.",
+       "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-confirmlink-ok-help": "Doorgaan na het weergeven van de storingsmeldingen over het koppelen.",
        "authprovider-resetpass-skip-label": "Overslaan",
        "authprovider-resetpass-skip-help": "Sla het resetten van het wachtwoord over.",
+       "authform-nosession-login": "De verificatie is geslaagd, maar uw browser heeft niet \"onthouden\" ingelogd te zijn.\n!\n$1",
+       "authform-nosession-signup": "Het account is aangemaakt, maar uw browser heeft niet \"onthouden\" om ingelogd te zijn.\n!\n$1",
        "authform-newtoken": "Ontbrekend token. $1",
        "authform-notoken": "Ontbrekend token",
        "authform-wrongtoken": "Verkeerd token",
        "specialpage-securitylevel-not-allowed-title": "Niet toegestaan",
+       "specialpage-securitylevel-not-allowed": "Sorry, het is u niet toegestaan gebruik te maken van deze pagina omdat uw identiteit niet kon worden geverifieerd.",
+       "authpage-cannot-login": "Niet in staat om te beginnen met aanmelden.",
+       "authpage-cannot-login-continue": "Niet mogelijk om in te loggen. Uw sessie is waarschijnlijk verlopen.",
+       "authpage-cannot-create": "Kon het account aanmaken niet starten.",
+       "authpage-cannot-create-continue": "Kan niet doorgaan met het aanmaken van een account. Uw sessie is waarschijnlijk verlopen.",
+       "authpage-cannot-link": "Niet in staat om het account te kunnen koppelen.",
+       "authpage-cannot-link-continue": "Niet mogelijk het account te koppelen. Uw sessie is waarschijnlijk verlopen.",
        "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-submit": "Accounts koppelen",
        "unlinkaccounts": "Accounts ontkoppelen",
        "unlinkaccounts-success": "Het account is ontkoppeld.",
+       "authenticationdatachange-ignored": "De wijziging van de authenticatie gegevens zijn niet afgehandeld. Misschien is er geen provider is geconfigureerd?",
        "userjsispublic": "Let op: JavaScript deelpagina's moeten geen vertrouwelijke gegevens bevatten omdat ze kunnen worden bekeken door andere gebruikers.",
        "usercssispublic": "Let op: CSS deelpagina's moeten geen vertrouwelijke gegevens bevatten omdat ze kunnen worden bekeken door andere gebruikers.",
        "restrictionsfield-badip": "Ongeldig IP-adres of range: $1",
        "restrictionsfield-label": "Toegestane IP-ranges:",
+       "restrictionsfield-help": "Een IP-adres of CIDR bereik per lijn. Om alles toe te staan, gebruik:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "versie $1",
        "pageid": "Pagina-ID $1"
 }
index 4142ed8..2f90dc6 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",
        "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.",
        "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",
        "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)",
        "lineno": "Line $1:",
        "compareselectedversions": "Samanlikn valde versjonar",
        "showhideselectedversions": "Vis/løyn valde versjonar",
-       "editundo": "angre",
+       "editundo": "fjern endringa",
        "diff-empty": "(Ingen skilnad)",
        "diff-multi-sameuser": "({{PLURAL:$1|Éin mellomversjon|$1 mellomversjonar}} av den same brukaren er ikkje {{PLURAL:$1|vist|viste}})",
        "diff-multi-otherusers": "({{PLURAL:$1|Éin mellomliggjande versjon|$1 mellomliggjande versjonar}} av {{PLURAL:$2|éin annan brukar|$2 brukarar}} er ikkje {{PLURAL:$1|vist|viste}})",
        "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}})",
        "listfiles-delete": "slett",
        "listfiles-summary": "Spesialsida viser alle opplasta filer.\nNår ho er filtrert etter brukar, vert berre filene der brukaren lasta opp den siste versjonen viste.",
        "listfiles_search_for": "Søk etter filnamn:",
+       "listfiles-userdoesnotexist": "Brukarkontoen «$1» er ikkje oppretta.",
        "imgfile": "fil",
        "listfiles": "Filliste",
        "listfiles_thumb": "Miniatyrbilete",
        "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]]»",
        "mycontris": "Bidrag",
        "anoncontribs": "Bidrag",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Brukarkontoen «$1» er ikkje oppretta.",
        "nocontribs": "Det vart ikkje funne nokon endringar gjorde av denne brukaren.",
        "uctop": "(gjeldande)",
        "month": "Månad:",
        "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",
+       "authmanager-userdoesnotexist": "Brukarkontoen «$1» er ikkje oppretta.",
+       "userjsispublic": "Merk: JavaScript-undersider bør ikkje innehalda konfidensielle data sidan dei er synlege for andre brukarar.",
+       "usercssispublic": "Merk: CSS-undersider bør ikkje innehalda konfidensielle data sidan dei er synlege for andre brukarar."
 }
index 266aa8a..1c27d45 100644 (file)
@@ -16,7 +16,9 @@
                        "Macofe",
                        "Matma Rex",
                        "Xð",
-                       "Nicolas Eynaud"
+                       "Nicolas Eynaud",
+                       "Fitoschido",
+                       "Vriullop"
                ]
        },
        "tog-underline": "Soslinhar los ligams :",
@@ -36,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",
        "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": "La pagina de títol demandada fa referéncia a una pagina de discussion qu'existís pas.",
-       "title-invalid-characters": "La pagina de títol demandada contèn de caractèrs invalides : $1",
+       "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-no-central-id": "Per intrar lo senhau d'un bot, devètz èsser connectat amb un còmpte globau.",
-       "botpasswords-createnew": "Crear un novèu senhau de bot",
-       "botpasswords-editexisting": "Editar un senhau de bot existent",
+       "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-created-title": "Senhau de bot creat",
-       "botpasswords-created-body": "Lo senhau dau bot per lo bot $1 de l'utilizaire $2 es estat creat",
-       "botpasswords-updated-title": "Senhau dau bot més a jorn",
-       "botpasswords-updated-body": "Lo senhau dau bot $1 de l'utilizaire $2 es estat més a jorn",
-       "botpasswords-deleted-title": "Senhau dau bot escafat",
-       "botpasswords-deleted-body": "Lo senhay dau bot $1 de l'utilizaire $2 es estat escafat",
-       "botpasswords-no-provider": "BotPasswordsSessionProvider es pas disponible",
+       "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": "Lei senhaus pòdon pas èsser cambiats : $1",
+       "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-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": "Se aquela adreiça de corrièr electrnic es associat ambé vòstre compte, un corrièr electronic de reïnicializacion de senhal es estat mandat.",
-       "passwordreset-emailsentusername": "Se una adreiça de corrier electronic es associada amb aqueu còmpte d'utilizaire, un senhau de reïnicializacion serà mandat.",
-       "passwordreset-invalidemail": "Adreiça electronica invalida",
+       "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.",
        "undo-failure": "Aquesta modificacion a pas pogut èsser desfaita a causa de conflictes amb de modificacions intermediàrias.",
        "undo-norev": "La modificacion a pas pogut èsser desfaita perque siá es inexistenta siá es estada suprimida.",
        "undo-nochange": "Sembla que la modificacion es ja estada anullada.",
-       "undo-summary": "Anullacion de las modificacions $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discutir]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
+       "undo-summary": "Anullacion de las modificacions $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])",
        "undo-summary-username-hidden": "Anullar la revision $1 per un utilizaire amagat",
        "cantcreateaccount-text": "La creacion de compte dempuèi aquesta adreça IP ('''$1''') es estada blocada per [[User:$3|$3]].\n\nLa rason balhada per $3 èra ''$2''.",
        "cantcreateaccount-range-text": "La creacion de compte dempuèi las adreças IP dins la plaja <strong>$1</strong>, que compren vòstra agreça IP (<strong>$4</strong>) son estadas blocadas per [[User:$3|$3]].\n\nLo motiu provesit per $3 es <em>$2</em>",
        "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.",
        "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",
        "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 :",
        "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",
        "userrights-user-editname": "Entrar un nom d’utilizaire :",
        "editusergroup": "Cargar de gropes d’utilizaires",
        "editinguser": "Modificacion dels dreits de l’{{GENDER:$1|utilizaire|utilizaira}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modificar los gropes de l’utilizaire",
-       "userrights-viewusergroup": "Veire lei grops d'utilizaires",
+       "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-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.",
        "group": "Grop :",
        "group-user": "Utilizaires",
        "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-sendemail": "Mandar un corrièl als autres utilizaires",
        "right-applychangetags": "Aplicar [[Special:Tags|las balisas]] amb sas pròprias modificacions",
        "grant-generic": "ensemble de dreits « $1 »",
+       "grant-group-page-interaction": "Interagir amb de paginas",
+       "grant-group-file-interaction": "Interagir amb de mèdias",
+       "grant-group-watchlist-interaction": "Interagir amb vòstra lista de seguiment",
        "grant-group-email": "Mandar un corrièr electronic",
+       "grant-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-editpage": "Editar lei paginas existentas",
-       "grant-editprotected": "Editar lei paginas protegidas",
+       "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-uploadeditmovefile": "Telecargar, remplaçar e desplaçar de fichiers",
-       "grant-uploadfile": "Telecargar un novèu fichier",
+       "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": "Veire lei fichiers e lei paginas escafats",
+       "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-deletelogentry": "Escafar lo jornau deis intradas",
-       "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": "Editar vòstrei preferéncias",
+       "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 la pagina",
+       "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-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",
        "recentchangeslinked-page": "Nom de la pagina :",
        "recentchangeslinked-to": "Afichar los cambiaments cap a las paginas ligadas al luòc de la pagina donada",
        "recentchanges-page-added-to-category": "[[:$1]] apondut a la categoria",
-       "recentchanges-page-removed-from-category": "[[:$1]] retirat de la categoria",
-       "autochange-username": "Cambiament automatic MediaWiki",
+       "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 telecargament es un doblon de <strong>[[:$1]]</strong>.",
-       "fileexists-duplicate-version": "Lo telecargament es un doblon de {{PLURAL:$2|an older version|older versions}} de <strong>[[:$1]]</strong>.",
+       "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-form-label-own-work": "Soi l'autor d'aquesta òbra",
        "upload-form-label-infoform-categories": "Categorias",
        "upload-form-label-infoform-date": "Data",
-       "upload-form-label-own-work-message-generic-foreign": "Compreni que siáu a telecargar aquest fichier vèrs un estocatge partejat. Confiermi que siáu a lo faire segon lei reglas d'utilizacion e de licéncia en vigor.",
-       "upload-form-label-not-own-work-message-generic-foreign": "Se siatz pas capable de telecargar aqust fichir segon lei reglas d'aquest estocatge partejat, mercé de sarrar aquest boita de dialògue a d'assaiar un autre metòde.",
+       "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": "La pagina dona accès ai fichiers que son telecargats o en cors de telecargament, mai pas encara publicats sus lo wiki. Aquelei fichiers son unicament visibles per l'utilizaire a l'origina dau telecargament.",
+       "uploadstash-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.",
        "listfiles-delete": "suprimir",
        "listfiles-summary": "Aquesta pagina especiala permet de far la lista de totes los fichièrs importats.",
        "listfiles_search_for": "Recèrca del mèdia nomenat :",
-       "listfiles-userdoesnotexist": "L'utilizaire \"$1\" es pas enregistrat.",
+       "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 d'aqueu fichier es ja identica an aquela qu'es seleccionada.",
+       "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",
        "protectedpages-unknown-timestamp": "Desconegut",
        "protectedpages-unknown-performer": "Utilizaire desconegut",
        "protectedtitles": "Títols protegits",
-       "protectedtitles-summary": "Aquò es una lista dei títols de pagina que son a l'ora d'ara protegits còntra la creacion. Per una lista dei paginas existentas que son protegidas, veire [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "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",
        "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-submit-invalid-fields-title": "De camps son invalides",
+       "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",
        "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.",
        "linksearch-error": "Los caractèrs « joker » pòdon pas èsser utilizats qu’al començament del nom de domeni.",
        "listusersfrom": "Afichar los utilizaires a partir de :",
        "listusers-submit": "Mostrar",
-       "listusers-noresult": "S'es pas trobat de noms d'utilizaires correspondents. Cercatz tanben amb de majusculas e minusculas.",
+       "listusers-noresult": "Cap d’utilizaires pas trobat.",
        "listusers-blocked": "(blocat)",
        "activeusers": "Lista dels utilizaires actius",
        "activeusers-intro": "Aquò es una lista dels utilizaires qu'an exerçat una activitat quina que siá al cors {{PLURAL:$1|de la darrièra jornada|dels $1 darrièrs jorns}}.",
        "activeusers-count": "$1 {{PLURAL:$1|accion|accions}} al moment {{PLURAL:$3|del darrièr jorn|dels $3 darrièrs jorns}}",
        "activeusers-from": "Afichar los utilizaires dempuèi :",
        "activeusers-noresult": "Cap d'utilizaire pas trobat.",
-       "activeusers-submit": "Mostrar leis utilizaires actius",
+       "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>",
        "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",
        "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...",
        "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 :",
        "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 lei drechs necessaris per desplaçar una pagina vèrs una categoria",
-       "cant-move-subpages": "Avètz pas lei drechs necessaris per desplaçar de sota-paginas.",
-       "namespace-nosubpages": "Lo nom d'espaci $1 autoriza pas lei sota-paginas.",
+       "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": "Ajustar de paginas manualament :",
+       "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-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)",
        "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) ?",
        "htmlform-datetime-placeholder": "AAAA-MM-JJ HH:MM:SS",
        "htmlform-title-not-exists": "$1 existís pas.",
        "htmlform-user-not-exists": "<strong>$1</strong> existís pas.",
-       "htmlform-user-not-valid": "<strong>$1</strong> es pas un nom d'utilizaire valide.",
+       "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-stashzerolength": "Lo servidor pòu pas estocar aqueu fichier perqué sa talha es nulla.",
-       "api-error-stashnotloggedin": "Devètz èsser connectat per enregistrar de fichiers dins l'espaci de telecargament.",
-       "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-submit": "Validar",
+       "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",
        "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-mediasearch-noresults": "Ges de resultat trobat",
-       "mw-widgets-categoryselector-add-category-placeholder": "Ajustar una categoria...",
-       "sessionprovider-generic": "$1 sessions",
+       "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": "Lei cookies son benlèu desactivats. Verificatz que lei cookies siegan ben activat e tornatz assaiar.",
+       "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 d'accion :",
-       "log-action-filter-delete": "Tipe d'accion :",
+       "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 :",
+       "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 :",
+       "log-action-filter-newusers": "Tipe de creacion de compte :",
        "log-action-filter-patrol": "Tipe de patrolha :",
-       "log-action-filter-protect": "Tipe d'accion :",
+       "log-action-filter-protect": "Tipe de proteccion :",
        "log-action-filter-rights": "Tipe de cambiament de dreits :",
        "log-action-filter-suppress": "Tipe de supression :",
-       "log-action-filter-upload": "Tipe de telecargament :",
+       "log-action-filter-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": "Escafament de pagina",
-       "log-action-filter-delete-restore": "Restauracion de pagina",
+       "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 d'etiqueta",
-       "log-action-filter-managetags-delete": "Supression d'etiqueta",
-       "log-action-filter-managetags-activate": "Activacion d'etiqueta",
-       "log-action-filter-managetags-deactivate": "Desactivacion d'etiqueta",
+       "log-action-filter-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 senhau mandat per corrier electronic",
+       "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 proteccion",
-       "log-action-filter-rights-rights": "Cambiament manuau",
+       "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": "Telecargament novèu",
-       "log-action-filter-upload-overwrite": "Retelecargament",
-       "authmanager-create-disabled": "La creacion de còmptes es blocada.",
-       "authmanager-authplugin-setpass-bad-domain": "Domeni invalide",
-       "authmanager-autocreate-noperm": "La creacion automatica de còmptes es blocada.",
-       "authmanager-password-help": "Senhau per autentificacion.",
-       "authmanager-domain-help": "Domeni per autentificacion extèrna.",
-       "authmanager-retype-help": "Mercé de confiermar vòstre senhau.",
+       "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é senhau",
-       "authmanager-provider-temporarypassword": "Senhau provisòri",
-       "authprovider-confirmlink-message": "Segon lei vòstreis assais recents de connexion, lei còmptes seguents pòdon èsser liats vèrs lo vòstre còmpte wiki. Lei liar permet de se connectar amb aqueleis còmptes. Mercé de seleccionar lei còmptes de liar.",
-       "authprovider-confirmlink-request-label": "Còmptes de liar",
-       "authprovider-confirmlink-success-line": "$1 : operacion capitada, lei còmptes son estats liats.",
-       "authprovider-confirmlink-failed": "La temptativa de liar lei còmptes a pas capitat : $1",
+       "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",
-       "specialpage-securitylevel-not-allowed-title": "Pas autorizat",
+       "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",
-       "linkaccounts": "Liar lei còmptes",
-       "linkaccounts-success-text": "Lo còmpte èra estat liat.",
-       "linkaccounts-submit": "Liar lei còmptes",
-       "revid": "Revision $1",
-       "pageid": "Pagina ID $1"
+       "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 d2376a5..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-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": "ଅଚଳ କରିଦିଆଯାଇଛି",
        "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 ଫାଇଲ ଅପଲୋଡ଼ କରିବା ଅନୁମୋଦିତ ନୁହେଁ କାରଣ ସେସବୁ ସୁରକ୍ଷା ବଳୟକୁ ନଷ୍ଟ କରିଦିଅନ୍ତି ।",
        "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 9c135cb..7171bae 100644 (file)
@@ -23,7 +23,8 @@
                        "아라",
                        "Macofe",
                        "ਪ੍ਰਚਾਰਕ",
-                       "Tow"
+                       "Tow",
+                       "Sony dandiwal"
                ]
        },
        "tog-underline": "ਲਿੰਕ ਹੇਠ-ਲਾਈਨ:",
        "sort-descending": "ਘਟਦਾ ਕ੍ਰਮ",
        "sort-ascending": "ਵਧਦਾ ਕ੍ਰਮ",
        "nstab-main": "ਸਫ਼ਾ",
-       "nstab-user": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨µà¨°à¨\95ਾ",
+       "nstab-user": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨¸à¨«à¨¼ਾ",
        "nstab-media": "ਮੀਡੀਆ ਸਫ਼ਾ",
        "nstab-special": "ਖ਼ਾਸ ਸਫ਼ਾ",
        "nstab-project": "ਪਰੋਜੈਕਟ ਸਫ਼ਾ",
        "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|ਪਾਸਵਰਡ ਬਦਲੋ]]'' ’ਤੇ ਜਾ ਕੇ ਪਾਸਵਰਡ ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ।",
        "saveprefs": "ਸੰਭਾਲੋ",
        "restoreprefs": "ਸਾਰੀਆਂ ਮੂਲ ਸੈਟਿੰਗਾਂ ਬਹਾਲ ਕਰੋ (ਸਾਰੇ ਹਿੱਸਿਆਂ ਵਿੱਚ)",
        "prefs-editing": "ਸੋਧ ਜਾਰੀ",
-       "rows": "ਕਤਾਰਾਂ:",
-       "columns": "ਕਾਲਮ:",
        "searchresultshead": "ਖੋਜ",
        "stub-threshold-sample-link": "ਨਮੂਨਾ",
        "stub-threshold-disabled": "ਬੰਦ ਹੈ",
        "right-upload_by_url": "URL ਤੋਂ ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ",
        "right-autoconfirmed": "ਨੀਮ-ਸੁਰੱਖਿਅਤ ਸਫ਼ਿਆਂ ਨੂੰ ਸੋਧਣਾ",
        "right-bot": "ਇੱਕ ਸਵੈ-ਚਾਲਤ ਅਮਲ ਵਜੋਂ ਗਿਣਿਆ ਜਾਣਾ",
-       "right-writeapi": "ਲਿਖਾਈ ਏਪੀਆਈ ਦੀ ਵਰਤੋੰ",
+       "right-writeapi": "ਲਿਖਾਈ API ਵਰਤੋ",
        "right-delete": "ਸਫ਼ੇ ਹਟਾਓ",
        "right-bigdelete": "ਵੱਡੇ ਅਤੀਤ ਵਾਲੇ ਪੰਨੇ ਮਿਟਾਉਣੇ",
        "right-browsearchive": "ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਖੋਜੋ",
        "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-thanks-title": "ਧੰਨਵਾਦ!",
        "feedback-useragent": "ਉਪਭੋਗੀ ਏਜੰਟ:",
        "searchsuggest-search": "ਖੋਜ {{SITENAME}}",
-       "api-error-badaccess-groups": "ਤੁਹਾਨੂੰ ਇਸ ਵਿਕੀ ਉੱਤੇ ਫ਼ਾਈਲਾਂ ਅੱਪਲੋਡ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "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 564ce6d..9d164db 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",
        "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-emailsentusername": "Jeśli z tym kontem powiązany jest adres e‐mail, zostanie na niego wysłany e-mail do odzyskiwania hasła.",
        "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",
        "selfredirect": "<strong>Ostrzeżenie:</strong> Przekierowujesz tę stronę do niej samej.\nByć może został przez Ciebie wybrany zły cel przekierowania lub edytujesz niewłaściwą stronę.\nJeżeli ponownie klikniesz „{{int:savearticle}}”, przekierowanie zostanie utworzone.",
        "missingcommenttext": "Wprowadź komentarz poniżej.",
        "missingcommentheader": "<strong>Uwaga:</strong> treść tytułu komentarza jest pusta.\nJeśli ponownie klikniesz „{{int:savearticle}}”, zmiany zostaną zapisane bez niego.",
-       "summary-preview": "Podgląd opisu:",
+       "summary-preview": "Podgląd opisu zmian:",
        "subject-preview": "Podgląd tematu:",
        "previewerrortext": "Wystąpił błąd podczas próby podglądu Twoich zmian.",
        "blockedtitle": "Użytkownik jest zablokowany",
        "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",
        "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",
        "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:",
        "userrights-user-editname": "Wprowadź nazwę użytkownika:",
        "editusergroup": "Wczytaj grupy użytkownika",
        "editinguser": "Zmiana uprawnień {{GENDER:$1|użytkownika|użytkowniczki}} <strong>[[User:$1|$1]]</strong> $2",
-       "viewinguserrights": "Przeglądanie grup do których należy {{GENDER:$1|użytkownik|użytkowniczka}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Edytuj grupy użytkownika",
+       "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-nodatabase": "Baza danych $1 nie istnieje lub nie jest lokalna.",
        "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.",
        "group": "Grupa:",
        "group-user": "Użytkownicy",
        "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",
        "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-feedbacklink": "Podziel się swoją opinią na temat tych nowych (beta) filtrów",
+       "rcfilters-highlightbutton-title": "Podświetl wyniki",
+       "rcfilters-highlightmenu-title": "Wybierz kolor",
        "rcfilters-filterlist-noresults": "Nie znaleziono filtrów",
+       "rcfilters-filtergroup-registration": "Rejestracja użytkownika",
+       "rcfilters-filter-registered-label": "Zarejestrowani",
+       "rcfilters-filter-registered-description": "Zalogowani edytorzy.",
+       "rcfilters-filter-unregistered-label": "Niezarejestrowani",
+       "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",
        "uploaded-setting-handler-svg": "SVG ustawiające atrybut \"handler\" z zdalnymi elementami/danymi/skryptami są blokowane. Znaleziono <code>$1=\"$2\"</code> w przesyłanym pliku SVG.",
        "uploaded-remote-url-svg": "SVG, które ustawiają w dowolnym atrybucie stylu zdalne URL, są blokowane. Znaleziono <code>$1=\"$2\"</code> w przesyłanym pliku SVG.",
        "uploaded-image-filter-svg": "Znaleziono filtr obrazu zawierający URL: <code>&lt;$1 $2=\"$3\"&gt;</code> w przesyłanym pliku SVG.",
-       "uploadscriptednamespace": "Ten plik SVG zawiera niedozwoloną przestrzeń nazw '$1'",
+       "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-params-json": "Parametry JSON:",
+       "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”.",
        "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}}”. {{GENDER:$2|Twoja}} odpowiedź na ten e-mail zostanie wysłana do {{GENDER:$1|oryginalnego nadawcy}}, a {{GENDER:$2|Twój}} adres e-mail zostanie {{GENDER:$1|mu|jej}} ujawniony.",
+       "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",
        "editcomment": "Edycję opisał: <em>$1</em>.",
        "revertpage": "Wycofano edycje użytkownika [[Special:Contributions/$2|$2]] ([[User talk:$2|dyskusja]]). Autor przywróconej wersji to [[User:$1|$1]].",
        "revertpage-nouser": "Wycofano edycje ukrytego użytkownika. Autor przywróconej wersji to {{GENDER:$1|[[User:$1|$1]]}}.",
-       "rollback-success": "Wycofano edycje użytkownika $1;\nprzywrócono ostatnią wersję autorstwa $2.",
+       "rollback-success": "Wycofano edycje {{GENDER:$3|użytkownika|użytkowniczki}} $1;\nprzywrócono ostatnią wersję autorstwa {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Wycofano edycje użytkownika $1;\nprzywrócono ostatnią wersję autorstwa $2. [$3 Pokaż zmiany]",
        "sessionfailure-title": "Błąd sesji",
        "sessionfailure": "Wystąpił problem z weryfikacją zalogowania.\nPolecenie zostało anulowane, aby uniknąć przechwycenia sesji.\nNaciśnij „wstecz” w przeglądarce, przeładuj stronę, po czym ponownie wydaj polecenie.",
        "changecontentmodel-emptymodels-title": "Nie ma dostępnych modeli treści",
        "changecontentmodel-emptymodels-text": "Zawartość [[:$1]] nie może być przekształcona do żadnego typu.",
        "log-name-contentmodel": "Rejestr zmian modelu zawartości",
-       "log-description-contentmodel": "Wydarzenia związane z modelami zawartości stron",
+       "log-description-contentmodel": "Ta strona wymienia zmiany w modelu zawartości stron oraz tworzenie nowych stron z modelem zawartości innym niż domyślnie.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|utworzył|utworzyła}} stronę $3 o niebędącym domyślnym modelu zawartości \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|zmienił|zmieniła|zmienił(a)}} model zawartości strony $3 z „$4” na „$5”",
        "logentry-contentmodel-change-revertlink": "Przywróć",
        "proxyblockreason": "Twój adres IP został zablokowany, ponieważ jest to adres otwartego proxy.\nO tym poważnym problemie dotyczącym bezpieczeństwa należy poinformować dostawcę Internetu lub pomoc techniczną.",
        "sorbsreason": "Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.",
        "sorbs_create_account_reason": "Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.\nNie możesz utworzyć konta",
+       "softblockrangesreason": "Edycje niezalogowanych z Twojego adresu IP ($1) są niedozwolone. Proszę się zalogować.",
        "xffblockreason": "Adres IP obecny w nagłówku X-Forwarded-For – twój lub serwera proxy, z którego korzystasz – został zablokowany. Powód blokady to: $1",
        "cant-see-hidden-user": "Konto użytkownika, które próbujesz zablokować, zostało już zablokowane oraz ukryte. Bez uprawnienia do ukrywania kont nie możesz zobaczyć oraz modyfikować blokady tego użytkownika.",
        "ipbblocked": "Nie możesz blokować i odblokowywać innych użytkowników, ponieważ sam jesteś zablokowany",
        "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",
        "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",
+       "notificationemail_body_changed": "Ktoś, najprawdopodobniej Ty, z adresu IP $1,\nzmienił adres e-mail przypisany do konta „$2” na „$3” w {{GRAMMAR:MS.lp|{{SITENAME}}}}.\n\nJeżeli nie zostało to zrobione przez Ciebie, skontaktuj się niezwłocznie z administratorem.",
+       "notificationemail_body_removed": "Ktoś, najprawdopodobniej Ty, z adresu IP $1,\nusunął adres e-mail przypisany do konta „$2” w {{GRAMMAR:MS.lp|{{SITENAME}}}}.\n\nJeżeli nie zostało to zrobione przez Ciebie, skontaktuj się niezwłocznie z administratorem.",
        "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",
        "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}} na tej stronie o tej samej zawartości.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Był już inny plik|Były już inne pliki}} na tej stronie 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 pomyślnie, 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 spodziewanym 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-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}}",
        "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",
        "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",
        "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>",
+       "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..e90c9ed 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۔",
        "watchlisttools-view": "ملدیاں ہوئیاں تبدیلیاں ویکھو",
        "watchlisttools-edit": "اکھ تھلے رکھے ہوۓ صفحیاں نوں ویکھو تے تبدیل کرو",
        "watchlisttools-raw": "کچی اکھ تھلے رکھی ہوئی نو تبدیل کرو",
+       "hijri-calendar-m1": "محرم",
+       "hijri-calendar-m2": "صفر",
+       "hijri-calendar-m3": "ربیع الاول",
+       "hijri-calendar-m4": "ربیع الثانی",
+       "hijri-calendar-m5": "جمادی الاول",
+       "hijri-calendar-m6": "جمادی الثانی",
+       "hijri-calendar-m7": "رجب",
+       "hijri-calendar-m8": "شعبان",
+       "hijri-calendar-m9": "رمضان",
+       "hijri-calendar-m10": "شوال",
+       "hijri-calendar-m11": "ذوالقعدہ",
+       "hijri-calendar-m12": "ذوالحجہ",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
        "duplicate-defaultsort": "'''خبردار:''' ڈیفالٹ چابی \"$2\" پہلی ڈیفالٹ چابی \"$1\" دے اتے لگ گئی اے۔",
        "version": "ورژن",
        "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 70abf16..2250b88 100644 (file)
                        "Tark",
                        "O Andarilho",
                        "Bruno.S.Alves 270",
-                       "!Silent"
+                       "!Silent",
+                       "Joao Xavier",
+                       "Nahime2015",
+                       "Alex Great"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "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",
        "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?",
        "selfredirect": "<strong>Aviso:</strong> Você esta redirecionando esta pagina para ela mesmo. Você pode ter especificado o caminho errado para redirecionar, ou você pode estar editando a pagina errada. Se você clicar \"{{int:savearticle}}\" novamente, o redirecionamento será criado de qualquer modo.",
        "missingcommenttext": "Por favor, introduzida um comentário abaixo.",
        "missingcommentheader": "'''Lembrete:''' Você não introduziu um assunto/título para este comentário.\nSe você clicar novamente \"{{int:savearticle}}\", a sua edição será salva sem um assunto/título.",
-       "summary-preview": "Previsão do resumo:",
+       "summary-preview": "Previsão do resumo de edição:",
        "subject-preview": "Previsão do assunto/título:",
        "previewerrortext": "Ocorreu um erro ao tentar pré-visualizar suas alterações.",
        "blockedtitle": "O usuário está bloqueado",
        "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!'''",
        "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",
        "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",
        "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:",
        "editinguser": "Modificando privilégios d{{GENDER:$1|o usuário|a usuária|o(a) usuário(a)}} <strong>[[User:$1|$1]]</Strong> $2",
        "viewinguserrights": "Visualizar os privilégios {{GENDER:$1|do usuário|da usuária}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Editar grupos {{GENDER:$1|do usuário|da usuária|do(a) usuário(a)}}",
-       "userrights-viewusergroup": "Ver grupos de usuários",
+       "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-nodatabase": "O banco de dados $1 não existe ou não é um banco de dados local.",
        "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.",
        "group": "Grupo:",
        "group-user": "Usuários",
        "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-feedbacklink": "Forneça feedback sobre os novos filtros (beta)",
+       "rcfilters-highlightbutton-title": "Realçar os resultados",
+       "rcfilters-highlightmenu-title": "Selecione uma cor",
+       "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",
        "uploaded-setting-handler-svg": "A configuração do atributo \"handler\" com destino remoto/de dados/<i>script</i> em arquivos SVG está bloqueada. Foi detetado <code>$1=\"$2\"</code> no arquivo SVG carregado.",
        "uploaded-remote-url-svg": "A configuração de qualquer atributo de estilo com um URL remoto em arquivos SVG está bloqueada. Foi detetado <code>$1=\"$2\"</code> no arquivo SVG carregado.",
        "uploaded-image-filter-svg": "Foi encontrado um filtro de imagem com o URL: <code>&lt;$1 $2=\"$3\"&gt;</code> no arquivo SVG carregado.",
-       "uploadscriptednamespace": "Este aruivo SVG contém um espaço nominal probido \"$1\"",
+       "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-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-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",
        "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].",
        "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",
        "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",
        "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",
        "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",
        "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ções",
        "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",
        "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-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",
        "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-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-logentry": "$1 {{GENDER:$2|atualizou}} etiquetas na entrada de registro $5 da página $3 ({{PLURAL:$7|adicionou}} $6; {{PLURAL:$9|removeu}} $8)",
        "rightsnone": "(nenhum)",
        "revdelete-summary": "resumo da edição",
+       "rightslogentry-temporary-group": "$1 (temporário, até $2)",
        "feedback-adding": "Adicionando os comentários na página...",
        "feedback-back": "Voltar",
        "feedback-bugcheck": "Perfeito! Apenas verifique se não é um dos [$1 bugs já conhecidos].",
        "feedback-useragent": "Agente de usuário:",
        "searchsuggest-search": "Pesquisar em {{SITENAME}}",
        "searchsuggest-containing": "páginas contendo…",
-       "api-error-badaccess-groups": "Você não tem permissão para enviar arquivos para este wiki.",
        "api-error-badtoken": "Erro interno: token inválido.",
-       "api-error-copyuploaddisabled": "O upload por URL está desativado neste servidor.",
-       "api-error-duplicate": "Já {{PLURAL:$1|há outro arquivo|existem outros arquivos}} no site com o mesmo conteúdo",
-       "api-error-duplicate-archive": "Já {{PLURAL:$1|existiu outro arquivo|existiram outros arquivos}} neste site com o mesmo conteúdo que, no entanto, {{PLURAL:$1|foi removido|foram removidos}}.",
-       "api-error-empty-file": "O arquivo que você enviou está vazio.",
        "api-error-emptypage": "Não é permitido criar páginas novas vazias.",
-       "api-error-fetchfileerror": "Erro interno: ocorreu um problema indeterminado ao acessar o arquivo.",
-       "api-error-fileexists-forbidden": "Já existe um arquivo com o nome \"$1\". Não é possível substituí-lo.",
-       "api-error-fileexists-shared-forbidden": "Já existe, no repositório de arquivos partilhados, um arquivo com o nome \"$1\". Não é possível substituí-lo.",
-       "api-error-file-too-large": "O arquivo que você enviou é muito grande.",
-       "api-error-filename-tooshort": "O nome do arquivo é curto demais.",
-       "api-error-filetype-banned": "Este tipo do arquivo é proibido.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|não é um tipo de arquivo permitido|não são tipos de arquivos permitidos}}. {{PLURAL:$3|O tipo de arquivo permitido é|Os tipos de arquivos permitidos são}} $2.",
-       "api-error-filetype-missing": "Falta a extensão de arquivo.",
-       "api-error-hookaborted": "A modificação que você tentou realizar foi abortada pelo hook de uma extensão.",
-       "api-error-http": "Erro interno: não foi possível conectar ao servidor.",
-       "api-error-illegal-filename": "O nome do arquivo não é permitido.",
-       "api-error-internal-error": "Erro interno: ocorreu algum erro ao processar o arquivo que você enviou ao wiki.",
-       "api-error-invalid-file-key": "Erro interno: o arquivo não foi encontrado no armazenamento temporário.",
-       "api-error-missingparam": "Erro interno: parâmetros em falta no pedido.",
-       "api-error-missingresult": "Erro interno: não foi possível determinar se a cópia foi feita.",
-       "api-error-mustbeloggedin": "Você precisa estar autenticado para enviar arquivos.",
-       "api-error-mustbeposted": "Erro interno: a solicitação requer HTTP POST",
-       "api-error-noimageinfo": "O upload foi concluído, mas o servidor não retornou informações sobre o arquivo.",
-       "api-error-nomodule": "Erro interno: o módulo de upload não está configurado.",
-       "api-error-ok-but-empty": "Erro interno: não há resposta do servidor.",
-       "api-error-overwrite": "Não é permitido sobrescrever um arquivo já existente.",
-       "api-error-stashfailed": "Erro interno: o servidor não conseguiu armazenar o arquivo temporário.",
        "api-error-publishfailed": "Erro interno: O servidor falhou ao publicar o arquivo temporário.",
-       "api-error-stasherror": "Houve um erro durante o upload do arquivo para a pilha.",
-       "api-error-stashedfilenotfound": "O arquivo escondido não foi encontrado ao tentar enviá-lo de seu esconderijo.",
-       "api-error-stashpathinvalid": "O caminho no qual o arquivo escondido deveria ter sido encontrado era inválido.",
-       "api-error-stashfilestorage": "Ocorreu um erro ao armazenar o arquivo em seu esconderijo.",
-       "api-error-stashzerolength": "O servidor não pôde esconder o arquivo, porque ele tinha zero de tamanho.",
-       "api-error-stashnotloggedin": "Você precisa estar logado para salvar arquivos no esconderijo.",
-       "api-error-stashwrongowner": "O arquivo que você estava tentando acessar no esconderijo não pertence a você.",
-       "api-error-stashnosuchfilekey": "O arquivo chave que você estava tentando acessar no esconderijo não existe.",
-       "api-error-timeout": "O servidor não respondeu dentro do tempo esperado.",
-       "api-error-unclassified": "Ocorreu um erro desconhecido",
-       "api-error-unknown-code": "Erro desconhecido: \"$1\"",
-       "api-error-unknown-error": "Erro interno: ocorreu um erro indeterminado ao tentar enviar o arquivo.",
-       "api-error-unknown-warning": "Aviso desconhecido: $1",
+       "api-error-stashfailed": "Erro interno: o servidor não conseguiu armazenar o arquivo temporário.",
+       "api-error-unknown-warning": "Aviso desconhecido: \"$1\".",
        "api-error-unknownerror": "Erro desconhecido: \"$1\".",
-       "api-error-uploaddisabled": "Este wiki está com o upload de arquivos desabilitado.",
-       "api-error-verification-error": "Este arquivo pode estar corrompido ou ter a extensão errada.",
        "duration-seconds": "$1 {{PLURAL:$1|segundo|segundos}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minutos}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|horas}}",
        "expand_templates_generate_xml": "Mostrar árvore de análise (parse) do XML",
        "expand_templates_generate_rawhtml": "Mostrar HTML puro",
        "expand_templates_preview": "Pré-visualização",
-       "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor, tente novamente.</strong> Se não funcionar, tente [[Special:UserLogout|sair]] e iniciar novamente a sessão.",
+       "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor, tente novamente.</strong> Se não funcionar, tente [[Special:UserLogout|sair]] e iniciar novamente a sessão e verifique se o seu navegador permite cookies neste site.",
        "expand_templates_preview_fail_html_anon": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e você não estar logado, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor, [[Special:UserLogin|entre]] e tente novamente.</strong>",
-       "pagelanguage": "Seletor de idioma de página",
+       "expand_templates_input_missing": "Você precisa fornecer pelo menos algum texto de entrada.",
+       "pagelanguage": "Mudar idioma da página",
        "pagelang-name": "Página",
        "pagelang-language": "Idioma",
        "pagelang-use-default": "Idioma padrão de uso",
        "pagelang-select-lang": "Selecionar idioma",
+       "pagelang-reason": "Razão:",
        "pagelang-submit": "Enviar",
+       "pagelang-nonexistent-page": "O artigo $1 não existe.",
+       "pagelang-unchanged-language": "A pagina $1 já está definido para idioma $2.",
+       "pagelang-unchanged-language-default": "A pagina $1 já está na língua de conteúdo padrão da wiki.",
+       "pagelang-db-failed": "O banco de dados falhou ao alterar o idioma da página.",
        "right-pagelang": "Mudar idioma da página",
        "action-pagelang": "mudar idioma da página",
-       "log-name-pagelang": "Mudar idioma do log",
+       "log-name-pagelang": "Registro de alteração de idioma",
        "log-description-pagelang": "Este é um registro de alterações aos idiomas das páginas.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|alterou}} o idioma da página $3 de $4 para $5.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|alterou}} o idioma da  $3 de $4 para $5",
        "default-skin-not-found": "Ops! A aparência padrão para sua wiki, definida em <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, não está disponível.\n\nSua instalação parece incluir a(s) seguinte(s) {{PLURAL:$4|aparência|aparências}}. Veja [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuração de aparência] para informações sobre como  {{PLURAL:$4|habilitá-la|habilitá-las e escolha a padrão}}.\n\n$2\n\n; Se você já instalou o MediaWiki:\n: Você provavelmente instalou do git, ou diretamente do código fonte usando usando algum outro método. Isto é esperado. Tente instalar algumas aparências do [https://www.mediawiki.org/wiki/Category:All_skins diretório de aparências do mediawiki.org]:\n:* Baixando o [https://www.mediawiki.org/wiki/Download instalador tarball], que vem com várias aparências e extensões. Você pode copiar e colar o diretório <code>skins/</code> dele.\n:* Baixando tarballs individuais de aparência de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git/pt-br#Usando_o_Git_para_baixar_extensões_do_MediaWiki Usando o Git para baixar aparências].\n: Fazer isso não deve interferir no seu repositório git se você é um desenvolvedor MediaWiki.\n\n; Se você já atualizou o MediaWiki:\n: O MediaWiki 1.24 e os mais recentes não permitem mais aparências instaladas automaticamente (veja [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Você pode colar {{PLURAL:$5|a seguinte linha|as seguintes linhas}} em <code>LocalSettings.php</code> para habilitar {{PLURAL:$5|a|todas as}} {{PLURAL:$5|aparência instalada|aparências instaladas}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se você já modificou <code>LocalSettings.php</code>:\n: Verifique cuidadosamente se não há erros de digitação nos nomes das aparências.",
        "default-skin-not-found-no-skins": "Opa! A aparência padrão da sua wiki, definida em <code>$wgDefaultSkin</code> como <code>$1</code>, não está disponível.\n\nVocê não tem aparências instaladas.\n\n; Se você acabou de instalar ou atualizar o MediaWiki:\n: Você provavelmente instalou do git, ou diretamente do código-fonte usando usando algum outro método. Isto é esperado. O MediaWiki 1.24 e mais recentes não incluem aparências no repositório principal. Tente instalar algumas aparências do [https://www.mediawiki.org/wiki/Category:All_skins/pt-br diretório de aparências do mediawiki.org]:\n:* Baixando o [https://www.mediawiki.org/wiki/Download/pt-br instalador tarball], que vem com várias aparências e extensões. Você pode copiar e colar o diretório <code>skins/</code> dele.\n:* Baixando tarballs individuais de aparência do [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Usando_o_Git_para_baixar_aparências_do_MediaWiki Usando o Git para baixar aparências].\n: Fazer isso não deve interferir no seu repositório git se você for um(a) desenvolvedor(a) do MediaWiki. Veja [https://www.mediawiki.org/wiki/Manual:Skin_configuration/pt-br Manual:Configuração de aparências] para informações sobre como habilitar aparências e escolher a padrão.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (habilitado)",
        "mediastatistics": "Estatísticas de mídia",
        "mediastatistics-summary": "Estatísticas sobre os tipos de arquivos carregados. Inclui apenas a versão mais recente do arquivo. Versões antigas ou apagadas são excluídas.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Tamanho total dos arquivos desta secção: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
+       "mediastatistics-allbytes": "Tamanho total de todos os arquivos: {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
        "mediastatistics-table-mimetype": "Tipo MIME",
        "mediastatistics-table-extensions": "Possíveis extensões",
        "mediastatistics-table-count": "Número de arquivos",
        "special-characters-group-ipa": "AFI (IPA)",
        "special-characters-group-symbols": "Símbolos",
        "special-characters-group-greek": "Grego",
+       "special-characters-group-greekextended": "Grego estendido",
        "special-characters-group-cyrillic": "Cirílico",
        "special-characters-group-arabic": "Árabe",
        "special-characters-group-arabicextended": "Árabe estendido",
        "mw-widgets-dateinput-no-date": "Nenhuma data selecionada",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Procurar por mídia",
+       "mw-widgets-mediasearch-noresults": "Nenhum resultado encontrado.",
        "mw-widgets-titleinput-description-new-page": "a página ainda não existe",
        "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
-       "randomrootpage": "Página raiz aleatória"
+       "mw-widgets-categoryselector-add-category-placeholder": "Adicionar uma categoria...",
+       "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 b0643b3..1a87f50 100644 (file)
        "searcharticle": "Ir",
        "history": "Histórico",
        "history_short": "Histórico",
+       "history_small": "histórico",
        "updatedmarker": "atualizado desde a minha última visita",
        "printableversion": "Versão para impressão",
        "permalink": "Ligação permanente",
        "botpasswords-label-delete": "Eliminar",
        "botpasswords-label-resetpassword": "Redefinir palavra-passe",
        "botpasswords-label-grants": "Concessões de permissões aplicáveis:",
-       "botpasswords-help-grants": "As concessões de permissões permitem acesso a permissões já detidas pela sua conta de utilizador. Fazer uma concessão aqui não fornece acesso a quaisquer permissões que a usa conta de utilizador não possua. Consulte a [[Special:ListGrants|tabela de concessões]] para mais informação.",
+       "botpasswords-help-grants": "As concessões de permissões permitem acesso a permissões já detidas pela sua conta de utilizador. Fazer uma concessão aqui não fornece acesso a quaisquer permissões que a sua conta de utilizador não possua. Consulte a [[Special:ListGrants|tabela de concessões]] para mais informação.",
        "botpasswords-label-grants-column": "Concedido",
        "botpasswords-bad-appid": "O nome do robô \"$1\" não é válido.",
        "botpasswords-insert-failed": "Falhou ao adicionar o nome do robô \"$1\". Já foi adicionado?",
        "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",
        "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",
        "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",
        "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:",
        "editinguser": "A modificar os privilégios {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}  <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "A ver os privilégios {{GENDER:$1|do utilizador|da utilizadora}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Editar grupos {{GENDER:$1|do utilizador|da utilizadora}}",
-       "userrights-viewusergroup": "Ver grupos do utilizador",
+       "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-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.",
        "group": "Grupo:",
        "group-user": "Utilizadores",
        "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-feedbacklink": "Dê-nos a sua opinião sobre os novos filtros (beta)",
+       "rcfilters-highlightbutton-title": "Realçar resultados",
+       "rcfilters-highlightmenu-title": "Selecionar uma cor",
+       "rcfilters-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",
        "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.",
        "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\".",
        "emailccsubject": "Cópia da sua mensagem para $1: $2",
        "emailsent": "Mensagem enviada",
        "emailsenttext": "A sua mensagem foi enviada.",
-       "emailuserfooter": "Esta mensagem foi enviada {{GENDER:$1|pelo utilizador|pela utilizadora}} $1 para {{GENDER:$2|$2}} através da opção \"{{int:emailuser}}\" da wiki {{SITENAME}}. {{GENDER:$2|A sua}} resposta será enviada diretamente para {{GENDER:$1|o|a}} remetente original, e irá revelar-lhe {{GENDER:$2|o seu}} endereço de correio eletrónico.",
+       "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",
        "editcomment": "O resumo da edição era: <em$1</em>.",
        "revertpage": "Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última revisão de [[User:$1|$1]]",
        "revertpage-nouser": "Foram revertidas as edições de um utilizador oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.",
+       "rollback-success": "Foram revertidas as edições de {{GENDER:$3|$1}}; reposta a última edição de {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertidas as edições de $1;\nMudança para a última revisão de $2. [$3 Mostrar alterações]",
        "sessionfailure-title": "Erro de sessão",
        "sessionfailure": "Foram detectados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a interceptação de sessões.\nVolte à página anterior, recarregue-a e tente novamente.",
        "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",
        "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",
        "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 eliminado|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",
        "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-block-block": "Bloqueio",
        "log-action-filter-block-reblock": "Alteração de bloqueio",
        "log-action-filter-block-unblock": "Desbloqueio",
-       "log-action-filter-contentmodel-change": "Alteração de modelo de conteúdo",
+       "log-action-filter-contentmodel-change": "Alteração do modelo de conteúdo",
        "log-action-filter-contentmodel-new": "Criação de página com modelo de conteúdo não padronizado",
        "log-action-filter-delete-delete": "Eliminação de página",
        "log-action-filter-delete-delete_redir": "Sobrescrição de redirecionamento",
        "usercssispublic": "Nota: As subpáginas de CSS não devem conter dados confidenciais porque podem ser vistas por outros utilizadores.",
        "restrictionsfield-badip": "Endereço IP (ou gama de endereços IP) inválido: $1",
        "restrictionsfield-label": "Gamas de endereços IP permitidas:",
-       "restrictionsfield-help": "Um endereço IP ou uma gama CIDR por linha. Para ativar todos,\nuse<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "Um endereço IP ou uma gama CIDR por linha. Para ativar todos,\nuse: <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisão $1",
        "pageid": "identificador de página $1"
 }
index bf23a1b..a3e2a8c 100644 (file)
                        "Ата",
                        "Matěj Suchánek",
                        "Chaduvari",
-                       "MarcoAurelio"
+                       "MarcoAurelio",
+                       "Joao Xavier",
+                       "Winstonyin",
+                       "Jhertel"
                ]
        },
        "sidebar": "{{notranslate}}",
        "search": "{{doc-special|Search}}\nNoun. Text of menu section shown on every page of the wiki above the search form.\n\nSee also:\n* {{msg-mw|Search}}\n* {{msg-mw|Accesskey-search}}\n* {{msg-mw|Tooltip-search}}\n{{Identical|Search}}",
        "search-ignored-headings": "Headings that will be ignored by search. You can translate the text, including \"Leave this line exactly as it is\". Some lines of this messages have one (1) leading space.",
        "searchbutton": "The button you can see in the sidebar, below the search input box. The \"Go\" button is {{msg-mw|Searcharticle}}.\n{{Identical|Search}}",
-       "go": "See also:\n* {{msg-mw|Go}}\n* {{msg-mw|Accesskey-search-go}}\n* {{msg-mw|Tooltip-search-go}}\n{{Identical|Go}}",
+       "go": "Appears next to the search button. Goes directly to the page with that name, if it exists.\n\nSee also:\n* {{msg-mw|Go}}\n* {{msg-mw|Accesskey-search-go}}\n* {{msg-mw|Tooltip-search-go}}\n{{Identical|Go}}",
        "searcharticle": "Button description in the search menu displayed on every page. The \"Search\" button is {{msg-mw|Searchbutton}}.\n{{Identical|Go}}",
        "history": "{{Identical|Page history}}",
        "history_short": "Text used on the history tab.\n\n{{Identical|History}}",
+       "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}}",
        "databaseerror-query": "Identifies, in the list of technical details, the [[wikipedia:SQL|SQL]] statement that failed.\nParameters:\n* $1 - SQL statement (shown within a box)\n{{Identical|Query}}",
        "databaseerror-function": "Identifies, in the list of technical details, the function that tried to execute the database query.\nParameters:\n* $1 - Name of function\n{{Identical|Function}}",
        "databaseerror-error": "Identifies, in the list of technical details, the error message the database server returned.\nParameters:\n* $1 - Error message from the database server, probably in English\n{{Identical|Error}}",
-       "transaction-duration-limit-exceeded": "Plain text error shown when DB updates take too long. Parameters:\n* $1 - time spent in database updates\n* $2 - maximum time allowed in database updates",
+       "transaction-duration-limit-exceeded": "Plain text error shown when DB updates take too long. Parameters:\n* $1 - time spent in database updates\n* $2 - maximum number of seconds allowed in database updates",
        "laggedslavemode": "Used as warning when getting the timestamp of the latest version, if in LaggedSlaveMode.",
        "readonly": "Used as title of error message when database is locked.",
        "enterlockreason": "For developers when locking the database",
        "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}}\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}}",
        "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}}",
        "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}}",
        "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-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.",
        "group": "{{Identical|Group}}",
        "group-user": "{{doc-group|user}}\n{{Identical|User}}",
        "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}}",
        "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 ivalid filter.",
+       "rcfilters-invalid-filter": "A label for an invalid filter.",
+       "rcfilters-empty-filter": "Placeholder for the filter list when no filters were chosen.",
        "rcfilters-filterlist-title": "Title for the filters list.\n{{Identical|Filter}}",
+       "rcfilters-filterlist-feedbacklink": "Caption for the link to the feedback page about the filters beta feature.",
+       "rcfilters-highlightbutton-title": "Title for the highlight button used to toggle the highlight feature on and off.",
+       "rcfilters-highlightmenu-title": "Title for the highlight menu used to select the highlight color for an individual filter.",
+       "rcfilters-highlightmenu-help": "Tooltip for the highlight menu for individual filters.",
        "rcfilters-filterlist-noresults": "Message showing no results found for searching a filter.",
-       "rcfilters-filtergroup-authorship": "Title for the filter group for edit authorship.",
+       "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-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-params-json": "Label for text field display the request parameters as JSON.",
-       "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",
        "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.\n\nSee [https://en.wikipedia.org/wiki/Help:Magic_links#RFC Help:Magic links] for more information on RFC magic links.",
-       "magiclink-tracking-rfc-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-rfc}}",
+       "magiclink-tracking-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\".",
        "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.",
        "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",
        "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}}.",
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 62f7dec..814f123 100644 (file)
        "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",
        "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.",
        "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 026e178..a58a9db 100644 (file)
        "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",
        "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.",
        "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 4181a4b..ac07205 100644 (file)
                        "SergeyButkov",
                        "Irus",
                        "Kareyac",
-                       "Mailman"
+                       "Mailman",
+                       "Аль-Гимравий",
+                       "Gamliel Fishkin",
+                       "Ping08",
+                       "Yuryleb",
+                       "Redredsonia"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
-       "tog-hideminor": "СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¼Ð°Ð»Ñ\8bе Ð¿Ñ\80авки из списка свежих правок",
+       "tog-hideminor": "СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¼Ð°Ð»Ñ\8bе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f из списка свежих правок",
        "tog-hidepatrolled": "Скрывать патрулированные правки в списке свежих правок",
        "tog-newpageshidepatrolled": "Скрывать отпатрулированные страницы в списке новых страниц",
        "tog-hidecategorization": "Скрывать категоризацию страниц",
        "tog-watchdeletion": "Добавлять в список наблюдения удалённые мной страницы и файлы",
        "tog-watchuploads": "Добавлять закачанные мною файлы в список наблюдения",
        "tog-watchrollback": "Добавлять страницы, где я выполнил откат, в мой список наблюдения",
-       "tog-minordefault": "Помечать по умолчанию правки как малозначимые",
+       "tog-minordefault": "По умолчанию помечать правки как малые",
        "tog-previewontop": "Помещать предпросмотр перед окном редактирования",
        "tog-previewonfirst": "Показывать предпросмотр при переходе к редактированию",
        "tog-enotifwatchlistpages": "Уведомлять по электронной почте об изменениях страниц и файлов из списка наблюдения",
        "broken-file-category": "Страницы с неработающими файловыми ссылками",
        "about": "Описание",
        "article": "Статья",
-       "newwindow": "&nbsp;(в новом окне)",
+       "newwindow": "(в новом окне)",
        "cancel": "Отменить",
        "moredotdotdot": "Далее…",
        "morenotlisted": "Этот список может быть неполным.",
        "searcharticle": "Перейти",
        "history": "История",
        "history_short": "История",
+       "history_small": "история",
        "updatedmarker": "обновлено после моего последнего посещения",
        "printableversion": "Версия для печати",
        "permalink": "Постоянная ссылка",
        "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": "Существующие пароли бота",
        "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": "причина не указана",
        "missing-revision": "Версия $1 страницы «{{FULLPAGENAME}}» не существует.\n\nЭто обычно бывает, если последовать по устаревшей ссылке на страницу, которая была удалена.\nПодробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
        "userpage-userdoesnotexist": "Учётной записи «<nowiki>$1</nowiki>» не существует. Убедитесь, что вы действительно желаете создать или изменить эту страницу.",
        "userpage-userdoesnotexist-view": "Не зарегистрировано учётной записи «$1».",
-       "blocked-notice-logextract": "Этот участник в данный момент заблокирован.\nНиже приведена последняя запись из журнала блокировок:",
+       "blocked-notice-logextract": "{{GENDER:$1|Этот участник|Эта участница}} в данный момент {{GENDER:$1|заблокирован|заблокирована}}.\nНиже приведена последняя запись из журнала блокировок:",
        "clearyourcache": "<strong>Замечание.</strong> Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.\n* <strong>Firefox / Safari:</strong> Удерживая клавишу <em>Shift</em>, нажмите на панели инструментов <em>Обновить</em> либо нажмите <em>Ctrl-F5</em> или <em>Ctrl-R</em> (<em>⌘-R</em> на Mac)\n* <strong>Google Chrome:</strong> Нажмите <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Mac)\n* <strong>Internet Explorer:</strong> Удерживая <em>Ctrl</em>, нажмите <em>Обновить</em> либо нажмите <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Перейдите в <em>Menu → Настройки</em> (<em>Opera → Настройки</em> на Mac), а затем <em>Безопасность → Очистить историю посещений → Кэшированные изображения и файлы</em>",
        "usercssyoucanpreview": "'''Подсказка.''' Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый CSS-файл перед сохранением.",
        "userjsyoucanpreview": "'''Подсказка.''' Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый JS-файл перед сохранением.",
        "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": "все",
        "saveprefs": "Сохранить",
        "restoreprefs": "Восстановить настройки по умолчанию",
        "prefs-editing": "Редактирование",
-       "rows": "Строк:",
-       "columns": "Столбцов:",
        "searchresultshead": "Поиск",
        "stub-threshold": "Порог для определения оформления ссылок на заготовки ($1):",
        "stub-threshold-sample-link": "пример",
        "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Эта информация будет общедоступной.",
        "userrights": "Управление правами участника",
        "userrights-lookup-user": "Выбор участника",
        "userrights-user-editname": "Введите имя учётной записи:",
-       "editusergroup": "Ð\97агÑ\80Ñ\83зка Ð³Ñ\80Ñ\83пп участников",
+       "editusergroup": "Ð\97агÑ\80Ñ\83зиÑ\82Ñ\8c Ð³Ñ\80Ñ\83ппÑ\8b участников",
        "editinguser": "Изменение прав {{GENDER:$1|участника|участницы}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Просмотр прав {{GENDER:$1|участника|участницы}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Изменение членства в группах",
-       "userrights-viewusergroup": "пÑ\80оÑ\81моÑ\82Ñ\80 Ð³Ñ\80Ñ\83пп Ñ\83Ñ\87аÑ\81Ñ\82ника",
+       "userrights-editusergroup": "Изменение групп {{GENDER:$1|участника|участницы}}",
+       "userrights-viewusergroup": "Ð\9fÑ\80оÑ\81моÑ\82Ñ\80 Ð³Ñ\80Ñ\83пп {{GENDER:$1|Ñ\83Ñ\87аÑ\81Ñ\82ника|Ñ\83Ñ\87аÑ\81Ñ\82ниÑ\86Ñ\8b}}",
        "saveusergroups": "Сохранить группы {{GENDER:$1|участника|участницы}}",
        "userrights-groupsmember": "Состоит в группах:",
        "userrights-groupsmember-auto": "Неявно состоит в группах:",
-       "userrights-groups-help": "Вы можете изменить группы, в которые входит этот участник.\n* Если около названия группы стоит отметка, значит участник входит в эту группу.\n* Если отметка не стоит — участник не относится к соответствующей группе.\n* Знак * отмечает, что вы не сможете удалить участника из группы, если добавите его в неё, или наоборот.",
+       "userrights-groups-help": "Вы можете изменить группы, в которые входит {{GENDER:$1|этот участник|эта участница}}.\n* Если около названия группы стоит отметка — {{GENDER:$1|участник|участница}} входит в эту группу.\n* Если отметка не стоит — {{GENDER:$1|участник|участница}} не входит в эту группу.\n* Символ * указывает на то, что вы не сможете удалить {{GENDER:$1|участника|участницу}} из группы, если добавите {{GENDER:$1|его|её}} в неё (или наоборот).\n* Символ # указывает на то, что вы можете только отложить время истечения этой группы, вы не можете перенести его на более ранний срок.",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "У вас нет разрешения изменять права участников в других вики.",
        "userrights-nodatabase": "База данных $1 не существует или расположена не локально.",
        "userrights-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": "Конфликт изменения прав участника! Пожалуйста, проверьте и примените изменения заново.",
        "group": "Группа:",
        "group-user": "Участники",
        "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": "объединение историй страниц",
        "action-browsearchive": "поиск удалённых страниц",
        "action-undelete": "восстановление страниц",
        "action-suppressrevision": "просмотр и восстановление скрытых версий страниц",
-       "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-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": "редактирование вашего списка наблюдения",
        "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-feedbacklink": "Оставить отзыв о новых (бета) фильтрах",
+       "rcfilters-highlightbutton-title": "Выделить результаты",
+       "rcfilters-highlightmenu-title": "Выберите цвет",
+       "rcfilters-highlightmenu-help": "Выберите цвет, чтобы подсветить это свойство",
+       "rcfilters-filterlist-noresults": "Фильтры не найдены",
+       "rcfilters-filtergroup-registration": "Регистрация участников",
+       "rcfilters-filter-registered-label": "Зарегистрированные",
+       "rcfilters-filter-registered-description": "Вошедшие редакторы.",
+       "rcfilters-filter-unregistered-label": "Незарегистрированные",
+       "rcfilters-filter-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».",
        "listusers-blocked": "(заблокирован{{GENDER:$1||а}})",
        "activeusers": "Список активных участников",
        "activeusers-intro": "Это список участников, совершавших какие-либо действия за {{PLURAL:$1|последний $1 день|последние $1 дня|последние $1 дней|1=последний день}}.",
-       "activeusers-count": "$1 {{PLURAL:$1|пÑ\80авка|пÑ\80авки|пÑ\80авок}} за {{PLURAL:$3|$3 последний день|последние $3 дня|последние $3 дней|1=последний день}}",
+       "activeusers-count": "$1 {{PLURAL:$1|дейÑ\81Ñ\82вие|дейÑ\81Ñ\82виÑ\8f|дейÑ\81Ñ\82вий}} за {{PLURAL:$3|$3 последний день|последние $3 дня|последние $3 дней|1=последний день}}",
        "activeusers-from": "Показать участников, начиная с:",
        "activeusers-groups": "Отображать участников, принадлежащих к группам:",
        "activeusers-excludegroups": "Исключать участников, принадлежащих к группам:",
        "emailccsubject": "Копия вашего сообщения для $1: $2",
        "emailsent": "Письмо отправлено",
        "emailsenttext": "Ваше электронное сообщение отправлено.",
-       "emailuserfooter": "Это письмо было отправлено {{GENDER:$2|участнику|участнице}} $2 от {{GENDER:$1|участника|участницы}} $1 с помощью функции «{{int:emailuser}}» проекта {{SITENAME}}.\n{{GENDER:$2|Письмо}} будет отослано напрямую {{GENDER:$1|отправителю}}, так что {{GENDER:$2|ваш}} адрес электронной почты станет известен {{GENDER:$1|ему|ей}}.",
+       "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действуйте с осторожностью.",
        "editcomment": "Было дано описание изменения: <em>$1</em>.",
        "revertpage": "Откат правок [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) к версии [[User:$1|$1]]",
        "revertpage-nouser": "Откат правок (имя участника скрыто) к версии {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Откачены правки $1; возврат к версии $2.",
+       "rollback-success": "Откачены правки {{GENDER:$3|$1}}; возврат к версии {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Откачены правки $1; возврат к последней версии $2. [$3 Показать изменения]",
        "sessionfailure-title": "Ошибка сеанса",
        "sessionfailure": "Похоже, возникли проблемы с текущим сеансом работы;\nэто действие было отменено в целях предотвращения «захвата сеанса».\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": "У вас нет разрешения переименовывать страницы.",
        "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Пожалуйста, выберите другое имя.",
        "spam_blanking": "Все версии содержат ссылки на $1, очистка",
        "spam_deleting": "Все версии содержали ссылки на $1, производится удаление",
        "simpleantispam-label": "Анти-спам проверка.\n<strong>Не</strong> заполняйте это!",
-       "pageinfo-title": "СведениÑ\8f Ð¿Ð¾ «$1»",
+       "pageinfo-title": "СведениÑ\8f Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86е «$1»",
        "pageinfo-not-current": "К сожалению, невозможно предоставить эту информацию для старых версий.",
        "pageinfo-header-basic": "Основные сведения",
        "pageinfo-header-edits": "История изменений",
        "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|править список как текст]].",
        "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|отпатрулировал|отпатрулировала}} [[special:permalink/76391984|\"старым патрулированием\"]] версию $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|он был удалён|они были удалены}}.",
-       "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-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-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": "Восстановление страницы",
        "usercssispublic": "Обратите внимание: подстраницы CSS не должны содержать конфиденциальные сведения, поскольку они доступны для просмотра другим участникам.",
        "restrictionsfield-badip": "Недопустимый IP-адрес или диапазон адресов: $1",
        "restrictionsfield-label": "Разрешённые диапазоны IP-адресов:",
-       "restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте <br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
+       "restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "версия $1",
        "pageid": "ID страницы $1"
 }
index dbc7b57..7c1f625 100644 (file)
@@ -11,7 +11,8 @@
                        "아라",
                        "Dicto23456",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "KHMELNYTSKYIA"
                ]
        },
        "tog-underline": "Підкреслёвати одказы:",
        "currentevents": "Актуалны подїї",
        "currentevents-url": "Project:Актуалны подїї",
        "disclaimers": "Вылучіня одповідности",
-       "disclaimerpage": "Project:Ð\92Ñ\8bлÑ\83Ñ\87Ñ\96нÑ\8f Ð¾Ð´Ð¿Ð¾Ð²Ñ\96дноÑ\81Ñ\82и",
+       "disclaimerpage": "Project:Ð\92Ñ\96дмова Ð²Ñ\96д Ð²Ñ\96дповÑ\96далÑ\8cноÑ\81Ñ\82Ñ\96",
        "edithelp": "Поміч едітованя",
        "mainpage": "Головна сторінка",
        "mainpage-description": "Головна сторінка",
        "passwordreset-emaildisabled": "Функції електронічной пошты были выпнуы на тій вікі.",
        "passwordreset-username": "Мено хоснователя:",
        "passwordreset-domain": "Домена:",
-       "passwordreset-capture": "Посмотрити выслїдный імейл?",
-       "passwordreset-capture-help": "Кідь означіте тото поличко, буде імейл (з дочасным геслом) оркем посланя хоснователёви указаный і вам.",
        "passwordreset-email": "Адреса електронічной пошты:",
        "passwordreset-emailtitle": "Детайлы конта на {{SITENAME}}",
        "passwordreset-emailtext-ip": "Дахто (може Вы, з IP адресы $1) попросив о наставлїня нового гесла до вашого конта на {{grammar:6sg|{{SITENAME}}}} ($4). З тов адресов {{PLURAL:$3|є повязане слїдуюче конто|суть повязаны слїдуючі конта}}:\n\n$2\n\n{{PLURAL:$3|Тото дочасне гесло стане неплатным|Тоты дочасны гесла стануть неплатныма}} {{PLURAL:$5|за день|за $5 днї|за $5 днїв}}.\nТеперь бы сьте ся мали приголосити і зволити собі нове гесло. Кідь тоту просьбу послав хтось другый або сьте собі на своє старе гесло спомянули і не хочете го змінити, можете тото повідомлїня іґноровати і дале хосновати старе гесло.",
        "saveprefs": "Уложыти",
        "restoreprefs": "Обновити вшыткы штандартны наставлїня (у вшыткых секціях)",
        "prefs-editing": "Едітованя",
-       "rows": "Рядкы:",
-       "columns": "Колонкы:",
        "searchresultshead": "Гляданя",
        "stub-threshold": "Поріг про форматованя одказу як <a href=\"#\" class=\"stub\">одказів на \"stub\"</a> (v bajtech):",
        "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": "Перезераня імейлів про зміну гесла",
        "newuserlogpage": "Лоґ вытварянь хоснователїв",
        "newuserlogpagetext": "Тото є список ново реґістрованых хоснователїв.",
        "rightslog": "Лоґ хосновательскых прав",
        "blocklink": "заблоковати",
        "unblocklink": "одблоковати",
        "change-blocklink": "змінити блок",
-       "contribslink": "пÑ\80иÑ\81пÑ\96вкÑ\8b",
+       "contribslink": "внеÑ\81ок",
        "emaillink": "послати імейл",
        "autoblocker": "Сьте были автоматічно блокованы, протоже здїляте IP-адресу з хоснователём „[[User:$1|$1]]“. Причіна блокованя того хоснователя: „$2“",
        "blocklogpage": "Запис блоковань",
        "version-license": "Ліценція",
        "version-ext-license": "Ліценція",
        "version-ext-colheader-name": "Росшырїня",
-       "version-ext-colheader-version": "Верзія",
+       "version-ext-colheader-version": "Версія",
        "version-ext-colheader-license": "Ліценція",
        "version-ext-colheader-description": "Попис",
        "version-ext-colheader-credits": "Авторы",
        "feedback-subject": "Предмет:",
        "feedback-submit": "Одослати",
        "feedback-thanks": "Дякуєме! Ваш коментарь быв приданый на сторінку „[$2 $1]“.",
-       "searchsuggest-search": "Глядати",
+       "searchsuggest-search": "Глядати {{SITENAME}}",
        "searchsuggest-containing": "обсягуючій...",
-       "api-error-badaccess-groups": "Не мате дозволено наладововати файлы на тоту вікі.",
        "api-error-badtoken": "Внутрїшня хыба: планый знак.",
-       "api-error-copyuploaddisabled": "Наладовованя з URL є на тім сервері заказане.",
-       "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": "Внутрїшня хыба: пожадавка мусить быти через 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 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 be679b1..8c3e93a 100644 (file)
        "searcharticle": "Көрдөр",
        "history": "Устуоруйата",
        "history_short": "Устуоруйа",
+       "history_small": "устуоруйата",
        "updatedmarker": "тиһэх киириим кэнниттэн уларыйбыт",
        "printableversion": "Бэчээттииргэ аналлаах барыл",
        "permalink": "Куруук баар сигэ",
        "createacct-another-username-ph": "Ааккын суруй",
        "yourpassword": "Киирии тыла:",
        "userlogin-yourpassword": "Аһарык",
-       "userlogin-yourpassword-ph": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын суруй",
-       "createacct-yourpassword-ph": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын суруй",
-       "yourpasswordagain": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын хатылаа:",
-       "createacct-yourpasswordagain": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын бигэргэт",
-       "createacct-yourpasswordagain-ph": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын хатылаа",
+       "userlogin-yourpassword-ph": "Ð\90һаÑ\80Ñ\8bккын суруй",
+       "createacct-yourpassword-ph": "Ð\90һаÑ\80Ñ\8bккын суруй",
+       "yourpasswordagain": "Ð\90һаÑ\80Ñ\8bккын хатылаа:",
+       "createacct-yourpasswordagain": "Ð\90һаÑ\80Ñ\8bккын бигэргэт",
+       "createacct-yourpasswordagain-ph": "Ð\90һаÑ\80Ñ\8bккын хатылаа",
        "userlogin-remembermypassword": "Тиһиликтэн тахсыма",
        "userlogin-signwithsecure": "Бигэ холбонуу",
        "cannotlogin-title": "Киирэр сатаммат",
        "gotaccount": "Бэлиэтэммитиҥ дуо? '''$1'''.",
        "gotaccountlink": "Аатыҥ",
        "userlogin-resetlink": "Киирэр тылгын умнубуккун дуо?",
-       "userlogin-resetpassword-link": "Ð\9aииÑ\80ии тылгын санаттараҕын дуо?",
+       "userlogin-resetpassword-link": "Ð\90һаÑ\80Ñ\8bк тылгын санаттараҕын дуо?",
        "userlogin-helplink2": "Киирэргэ көмө",
        "userlogin-loggedin": "Маннык аатынан киирбиккин {{GENDER:$1|$1}}.\nАтын аатынан киирэргэ аллара көстөр форманы туһан.",
        "userlogin-reauth": "Тиһиккэ хат киирэн {{GENDER:$1|$1}} буоларгын бигэргэтиэхтээххин.",
        "nouserspecified": "Кыттааччы аатын киллэриэхтээххин.",
        "login-userblocked": "Бу кыттааччы бобуллубут. Тиһиккэ киирии көҥүллэммэт.",
        "wrongpassword": "Киирии тылыҥ сыыһалаах. Өссө киллэрэн көр.",
-       "wrongpasswordempty": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгÑ\8bн Ñ\81Ñ\83Ñ\80Ñ\83йбаÑ\82аÑ\85Ñ\85Ñ\8bн. Ó¨Ñ\81Ñ\81Ó© киирэн көр.",
+       "wrongpasswordempty": "Ð\90һаÑ\80Ñ\8bккÑ\8bн Ñ\81Ñ\83Ñ\80Ñ\83йбаÑ\82аÑ\85Ñ\85Ñ\8bн. Ð¥Ð°Ñ\82 киирэн көр.",
        "passwordtooshort": "Киирии тылыҥ наһаа кылгас.\nКырата {{PLURAL:$1|1 бэлиэлээх|$1 бэлиэлээх}} буолуохтаах.",
        "passwordtoolong": "Аһарык {{PLURAL:$1|1 бэлиэттэн|$1 бэлиэттэн}} уһун буолуо суохтаах.",
        "passwordtoopopular": "Элбэхтэ туттуллар аһарыктары туттар сатаммат. Бука диэн атын аһарыкта тал.",
        "password-name-match": "Аһарыгыҥ ааккыттан атын буолуохтаах.",
        "password-login-forbidden": "Маннык ааты уонна киирии тылы туһаныы бобуллар.",
        "mailmypassword": "Киирии тылы саҥардыы",
-       "passwordremindertitle": "{{SITENAME}} ÐºÐ¸Ð¸Ñ\80ии тылын санатыы",
-       "passwordremindertext": "Ким эрэ (бадаҕа эн бу IP-аадырыстан: $1), {{SITENAME}} ($4) аһарыгын саҥаттан ыытыҥ диэбит.\n\"$2\" кыттааччы быстах аһарыга билигин маннык: \"$3\".\nӨскө маны эн чахчы көрдөөбүт буоллаххына, систиэмэҕэ саҥаттан киирэҥҥин аһарыккын уларытыаххын сөп.\nБыстах аһарык {{PLURAL:$5|биир хонук|$5 хонук устата}} үлэлиир.\n\nӨскөтүн аһарыгы саҥаттан көрдөөбөтөх буоллаххына,\nэбэтэр урукку аһарыккн өйдөөн кэлбит буоллаххына,\nбу суругу ааххайыма уонна урукку аһарыккын салгыы туһан.",
+       "passwordremindertitle": "{{SITENAME}} Ð°Ò»Ð°Ñ\80Ñ\8bк тылын санатыы",
+       "passwordremindertext": "Ким эрэ (бадаҕа Эн бу IP-аадырыстан: $1), {{SITENAME}} ($4) аһарыгын саҥаттан ыытыҥ диэбит.\n\"$2\" кыттааччы быстах аһарыга билигин маннык: \"$3\".\nӨскө маны эн чахчы көрдөөбүт буоллаххына, систиэмэҕэ саҥаттан киирэҥҥин аһарыккын уларытыаххын сөп.\nБыстах аһарык {{PLURAL:$5|биир хонук|$5 хонук устата}} үлэлиир.\n\nӨскөтүн аһарыгы саҥаттан көрдөөбөтөх буоллаххына,\nэбэтэр урукку аһарыккын өйдөөн кэлбит буоллаххына,\nбу суругу ааххайыма уонна урукку аһарыккын салгыы туһан.",
        "noemail": "\"$1\" ааттаах киһиэхэ эл. почтата ыйыллыбатах.",
        "noemailcreate": "Электроннай почтаҥ сөптөөх аадырыһын суруйуохтааххын",
        "passwordsent": "Саҥа аһарык тыл \"$1\" эл. почтатыгар ыытылынна.\nТиһиккэ киирэргэ саҥа аһарыгы туһан.",
        "accountcreated": "Саҥа аат иҥэрилиннэ",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|ыр.]]) бэлиэ аат оҥоһулунна.",
        "createaccount-title": "{{SITENAME}} бырайыакка саҥа аат оҥоруу",
-       "createaccount-text": "Ð\9aим Ñ\8dÑ\80Ñ\8d {{SITENAME}} Ð±Ñ\8bÑ\80айÑ\8bакка ($4) Ñ\81аҥа $2 Ð°Ð°Ñ\82Ñ\8b Ð±Ñ\8dлиÑ\8dÑ\82Ñ\8dÑ\8dбиÑ\82. \"$2\" ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bла \"$3\". Ð\91илигин ÐºÐ¸Ð¸Ñ\80Ñ\8dн ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлгÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bаÑ\85Ñ\85Ñ\8bн Ð½Ð°Ð°Ð´Ð°.\n\nСаҥа аат сыыһа оҥоһуллубут буоллаҕына тугу да гыныа суоххун сөп.",
+       "createaccount-text": "Ð\9aим Ñ\8dÑ\80Ñ\8d {{SITENAME}} Ð±Ñ\8bÑ\80айÑ\8bакка ($4) Ñ\81аҥа $2 Ð°Ð°Ñ\82Ñ\8b Ð±Ñ\8dлиÑ\8dÑ\82Ñ\8dÑ\8dбиÑ\82. \"$2\" Ð°Ò»Ð°Ñ\80Ñ\8bга \"$3\". Ð\91илигин ÐºÐ¸Ð¸Ñ\80Ñ\8dн Ð°Ò»Ð°Ñ\80Ñ\8bк Ñ\82Ñ\8bлгÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bаÑ\85Ñ\82ааÑ\85 Ñ\8dбиккин.\n\nСаҥа аат сыыһа оҥоһуллубут буоллаҕына тугу да гыныа суоххун сөп.",
        "login-throttled": "Ааккын аһара элбэхтик билиһиннэрэ сатаатыҥ.\nБука диэн $1 буолан баран өссө киирэн көрөөр.",
        "login-abort-generic": "Бу аатынан сатаан киирбэтиҥ - быһынна",
        "login-migrated-generic": "Эн бэлиэ-аатыҥ көһөрүллүбүт, онон урукку аатыҥ бу биикигэ суох буолбут эбит.",
        "changepassword": "Киирии тылы уларытарга",
        "resetpass_announce": "Түмүктүүргэ саҥа киирии тылла суруй.",
        "resetpass_text": "<!-- Тиэкиһи манна эбэн суруйуҥ -->",
-       "resetpass_header": "Ð\90аÑ\82 ÐºÐ¸Ð¸Ñ\80ии тылын уларытыы",
+       "resetpass_header": "Ð\91Ñ\8dлиÑ\8d-ааÑ\82 Ð°Ò»Ð°Ñ\80Ñ\8bк тылын уларытыы",
        "oldpassword": "Эргэ аһарык:",
        "newpassword": "Саҥа аһарык:",
        "retypenew": "Саҥа киирии тылы хатылаа:",
        "passwordreset-domain": "Домен:",
        "passwordreset-email": "Электроннай почтата:",
        "passwordreset-emailtitle": "{{SITENAME}} бырайыакка аатын туһунан",
-       "passwordreset-emailtext-ip": "Ким эрэ (баҕар эн буолуо, бу IP-ттан $1)  {{SITENAME}} ($4) бырайыакка киирии тылы уларытар туһунан ыйытык биэрбит.\nБу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}:\n\n$2\n\nБу быстах кэмҥэ аналлаах {{PLURAL:$3|киирии тыл|кирии тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.\nЭн тиһиликкэ ааккын этэн саҥа киирии тылы киллэриэхтээххин.\nӨскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку киирии тылгын өйдөөн кэлбит буоллаххына \nбу биллэриини ааххайыа суоххун сөп.\nОччоҕо урукку киирии тылыҥ оннунан хаалыа.",
-       "passwordreset-emailtext-user": "$1 Ð´Ð¸Ñ\8dн ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b  {{SITENAME}} ($4) Ð±Ñ\8bÑ\80айÑ\8bакка ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлгÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 Ñ\82Ñ\83Ò»Ñ\83нан Ñ\8bйÑ\8bÑ\82Ñ\8bк Ñ\8bÑ\8bппÑ\8bÑ\82.\nÐ\91Ñ\83 Ñ\8dлекÑ\82Ñ\80он Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b ÐºÑ\8bÑ\82Ñ\82а Ð±Ñ\83 {{PLURAL:$3|ааÑ\82 Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85|ааÑ\82Ñ\82аÑ\80 Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85Ñ\82Ñ\8dÑ\80}}\n\n$2\n\nÐ\91Ñ\83 Ð±Ñ\8bÑ\81Ñ\82аÑ\85 ÐºÑ\8dмҥÑ\8d Ð°Ð½Ð°Ð»Ð»Ð°Ð°Ñ\85 {{PLURAL:$3|кииÑ\80ии Ñ\82Ñ\8bл|киÑ\80ии Ñ\82Ñ\8bллаÑ\80}} {{PLURAL:$5|бииÑ\80 ÐºÒ¯Ð½ Ò¯Ð»Ñ\8dлиÑ\8dÒ\95Ñ\8d|$5 ÐºÒ¯Ð½ Ò¯Ð»Ñ\8dлиÑ\8dÑ\85Ñ\82Ñ\8dÑ\80Ñ\8d}}.\nЭн Ñ\82иһиликкÑ\8d Ð°Ð°ÐºÐºÑ\8bн Ñ\8dÑ\82Ñ\8dн Ñ\81аҥа ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлÑ\8b ÐºÐ¸Ð»Ð»Ñ\8dÑ\80иÑ\8dÑ\85Ñ\82Ñ\8dÑ\8dÑ\85Ñ\85ин.\nÓ¨Ñ\81кө Ð±Ñ\83 Ñ\8bйÑ\8bÑ\82Ñ\8bгÑ\8b Ñ\8bÑ\8bппаÑ\82аÑ\85 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна, Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ñ\83Ñ\80Ñ\83ккÑ\83 ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлгÑ\8bн Ó©Ð¹Ð´Ó©Ó©Ð½ ÐºÑ\8dлбиÑ\82 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна \nбÑ\83 Ð±Ð¸Ð»Ð»Ñ\8dÑ\80иини Ð°Ð°Ñ\85Ñ\85айÑ\8bа Ñ\81Ñ\83оÑ\85Ñ\85Ñ\83н Ñ\81өп.\nÐ\9eÑ\87Ñ\87оÒ\95о Ñ\83Ñ\80Ñ\83ккÑ\83 ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлыҥ оннунан хаалыа.",
+       "passwordreset-emailtext-ip": "Ким эрэ (баҕар Эн буолуо, бу IP-ттан $1)  {{SITENAME}} ($4) бырайыакка аһарык тылы уларытар туһунан ыйытык биэрбит.\nБу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}:\n\n$2\n\nБу быстах кэмҥэ аналлаах {{PLURAL:$3|аһарык|аһарык тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.\nЭн тиһиликкэ ааккын этэн саҥа аһарык тылы киллэриэхтээххин.\nӨскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку аһарык тылгын өйдөөн кэлбит буоллаххына \nбу биллэриини ааххайыа суоххун сөп.\nОччоҕо урукку аһарык тылыҥ оннунан хаалыа.",
+       "passwordreset-emailtext-user": "$1 Ð´Ð¸Ñ\8dн ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b  {{SITENAME}} ($4) Ð±Ñ\8bÑ\80айÑ\8bакка Ð°Ò»Ð°Ñ\80Ñ\8bккÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 Ñ\82Ñ\83Ò»Ñ\83нан Ñ\8bйÑ\8bÑ\82Ñ\8bк Ñ\8bÑ\8bппÑ\8bÑ\82.\nÐ\91Ñ\83 Ñ\8dлекÑ\82Ñ\80он Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b ÐºÑ\8bÑ\82Ñ\82а Ð±Ñ\83 {{PLURAL:$3|ааÑ\82 Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85|ааÑ\82Ñ\82аÑ\80 Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85Ñ\82Ñ\8dÑ\80}}\n\n$2\n\nÐ\91Ñ\83 Ð±Ñ\8bÑ\81Ñ\82аÑ\85 ÐºÑ\8dмҥÑ\8d Ð°Ð½Ð°Ð»Ð»Ð°Ð°Ñ\85 {{PLURAL:$3|аһаÑ\80Ñ\8bк|аһаÑ\80Ñ\8bкÑ\82аÑ\80}} {{PLURAL:$5|бииÑ\80 ÐºÒ¯Ð½ Ò¯Ð»Ñ\8dлиÑ\8dÒ\95Ñ\8d|$5 ÐºÒ¯Ð½ Ò¯Ð»Ñ\8dлиÑ\8dÑ\85Ñ\82Ñ\8dÑ\80Ñ\8d}}.\nЭн Ñ\82иһиликкÑ\8d Ð°Ð°ÐºÐºÑ\8bн Ñ\8dÑ\82Ñ\8dн Ñ\81аҥа ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлÑ\8b ÐºÐ¸Ð»Ð»Ñ\8dÑ\80иÑ\8dÑ\85Ñ\82Ñ\8dÑ\8dÑ\85Ñ\85ин.\nÓ¨Ñ\81кө Ð±Ñ\83 Ñ\8bйÑ\8bÑ\82Ñ\8bгÑ\8b Ñ\8bÑ\8bппаÑ\82аÑ\85 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна, Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ñ\83Ñ\80Ñ\83ккÑ\83 Ð°Ò»Ð°Ñ\80Ñ\8bккÑ\8bн Ó©Ð¹Ð´Ó©Ó©Ð½ ÐºÑ\8dлбиÑ\82 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна \nбÑ\83 Ð±Ð¸Ð»Ð»Ñ\8dÑ\80иини Ð°Ð°Ñ\85Ñ\85айÑ\8bа Ñ\81Ñ\83оÑ\85Ñ\85Ñ\83н Ñ\81өп.\nÐ\9eÑ\87Ñ\87оÒ\95о Ñ\83Ñ\80Ñ\83ккÑ\83 Ð°Ò»Ð°Ñ\80Ñ\8bгыҥ оннунан хаалыа.",
        "passwordreset-emailelement": "Кыттааччы: \n$1\n\nБыстах аһарык тыл: \n$2",
        "passwordreset-emailsentemail": "Өскө бу Эн ааккар баайыллыбыт аадырыс буоллаҕына, аһарык тылы уларытар туһунан сурук барыа.",
        "passwordreset-emailsentusername": "Өскө бу аакка баайыллыбыт аадырыс баар буоллаҕына, аһарык тылы уларытар туһунан сурук онно барыа.",
        "blockedtitle": "Кыттааччы уларытар кыаҕа быһылынна",
        "blockedtext": "'''Эн аатыҥ эбэтэр IP-аадырыһыҥ бобулуннулар.'''\n\nБоппут киһи $1.\nТөрүөтэ: ''«$2»''.\n\n*Бобуллубут: $8\n*Бобуу болдьоҕо: $6\n*Бобулунна: $7\n\nЭн $1 диэн киһиэхэ эбэтэр атын [[{{MediaWiki:Grouppage-sysop}}|администраатарга]] суруйан быһаарсыаххын сөп.\nБолҕой, өскө регистрацияламматах буоллаххына, эбэтэр эл. аадырыскын [[Special:Preferences|бигэргэппэтэх]] буоллаххына, эбэтэр сурук суруйарыҥ бобуллубут буоллаҕына администраатарга суруйар кыаҕыҥ суох.\nЭн IP-аадырыһыҥ — $3, бобуу нүөмэрэ — #$5.\nОну суруккар киллэрээр.",
        "autoblockedtext": "Эн IP-аадырыскын ханнык эрэ бу бырайыакка кыттара бобуллубут киһи туһана сылдьыбыт, онон бу IP-аадырыс бобуулаах. Боппут администраатар ($1) ол төрүөтүн маннык суруйбут:\n\n:''$2''\n\n*Бобуллубут: $8\n*Бобуу болдьоҕо: $6\n*Бобулунна: $7\n\nЭн $1 диэн киһиэхэ эбэтэр атын [[{{MediaWiki:Grouppage-sysop}}|администраатарга]] сурук суруйан быһаарсыаххын сөп.\n\nБолҕой, өскө регистрацияламматах буоллаххына, эбэтэр эл. аадырыскын [[Special:Preferences|бигэргэппэтэх]]  буоллаххына, эбэтэр сурук суруйарыҥ бобуллубут буоллаҕына администраатарга суруйар кыаҕыҥ суох.\n\nIP-аадырыһыҥ $3, бобуу нүөмэрэ — #$5.\nОну суруккар киллэрээр.",
+       "systemblockedtext": "Бэлиэ-ааккын эбэтэр IP-аадырыскын MediaWiki хааччахтаабыт.\nЫйыллыбыт төрүөтэ:\n\n:<em>$2</em>\n\n* Хааччах саҕаланыыта: $8\n* Хааччах уһуллуута: $6\n* Бүөлээһин соруга: $7\n\nЭн билиҥҥи IP-аадырыһыҥ $3.\nБыһаарсар буоллаххына, бу сибидиэнньэлэри этээр дуу.",
        "blockednoreason": "биир да биричиинэ сөп түбэспэт",
        "whitelistedittext": "Улатыаххын баҕарар буоллаххына маны $1 гын.",
        "confirmedittext": "Уларытарга эл. почтаҥ аадырыһын бигэргэтиэхтээххин. Бастаан [[Special:Preferences|манна]] киирэн бэйэн ааккын уонна эл. почтаҕын суруй. Онтон эл. аадырыскын бигэргэт.",
        "saveprefs": "Бигэргэт",
        "restoreprefs": "Туруоруулары саҥаттан (салааларга барыларыгар)",
        "prefs-editing": "Уларытыы",
-       "rows": "Строкаалара:",
-       "columns": "Колонкалара:",
        "searchresultshead": "Көрдөөһүн түмүгэ",
        "stub-threshold": "Омооннорго ыйынньыктары оҥоруу боруога ($1):",
        "stub-threshold-sample-link": "холобур",
        "prefs-help-gender": "Маны туруорар булгуччута суох. \nБырагыраамма сорох дьоҥҥо туһаайыллыбыт биллэриилэригэр эбэтэр кинилэргэ сыһыаннаах этиилэригэр кытааччы дьахтарыттан эбэтэр эр киһититтэн көрөн этии тутулун уларытан биэриэн сөп. \nТуора дьоҥҥо көстөр бэлиэтээһин.",
        "email": "Почта",
        "prefs-help-realname": "Сурукка киирбит аатыҥ булгуччута суох. Суруйдаххына ааптар быһыытынан ыйыллар буолуоҥ.",
-       "prefs-help-email": "ЭлекÑ\82Ñ\80оннай Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b Ñ\81Ñ\83Ñ\80Ñ\83йаÑ\80 Ð±Ñ\83лгÑ\83Ñ\87Ñ\87Ñ\83Ñ\82а Ñ\81Ñ\83оÑ\85, Ð¾Ð» Ñ\8dÑ\80Ñ\8dÑ\8dÑ\80и ÐºÐ¸Ð¸Ñ\80ии тылгын умуннаххына санатарга көмөлөһүө.",
+       "prefs-help-email": "ЭлекÑ\82Ñ\80оннай Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b Ñ\81Ñ\83Ñ\80Ñ\83йаÑ\80 Ð±Ñ\83лгÑ\83Ñ\87Ñ\87Ñ\83Ñ\82а Ñ\81Ñ\83оÑ\85, Ð¾Ð» Ñ\8dÑ\80Ñ\8dÑ\8dÑ\80и Ð°Ò»Ð°Ñ\80Ñ\8bк тылгын умуннаххына санатарга көмөлөһүө.",
        "prefs-help-email-others": "Эбии. Атын кыттааччылар Эйигин кытта электроннай почтаҕын билбэккэ эрэ суруйсар кыахтаныахтара.",
        "prefs-help-email-required": "E-mail баар буолуохтаах.",
        "prefs-info": "Сүрүн сибидиэнньэлэр",
        "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 кыра уларыйыылары",
        "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-билэрэри манна угар бобуллар.",
        "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|билэ бобуллубут көрүҥэ|билэ бобуллубут көрүҥнэрэ}}. \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-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 чаас",
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 037258d..9549557 100644 (file)
        "prefs-rendering": "حليو",
        "saveprefs": "سانڍيو",
        "prefs-editing": "سنوارڻ",
-       "rows": "قطارون:",
-       "columns": "ڪالمَ:",
        "searchresultshead": "ڳولا",
        "stub-threshold-sample-link": "نمونو",
        "stub-threshold-disabled": "غيرفعال",
        "sharedupload-desc-here": "ھي فائيل $1 مان آھي ۽ ٻين رٿائن پاران پڻ استعمال ٿي سگھي ٿو. تشريح انجي [[$2 جو تشريحي صفحو]] ھيٺان ڏنل آھي.",
        "uploadnewversion-linktext": "هن فائيل جو نئون پرت چاڙهيو",
        "shared-repo-from": "$1 کان",
+       "shared-repo-name-wikimediacommons": "وڪيميڊيا ڪامنز",
        "upload-disallowed-here": "توھان ھن فائيل مٿان لکي نہ ٿا سگھو.",
        "filerevert-comment": "سبب:",
        "filerevert-submit": "واپس ورايو",
        "statistics-articles": "موادي صفحا",
        "statistics-pages": "صفحا",
        "statistics-files": "چاڙهيل فائيل",
+       "statistics-edits": "{{SITENAME}} جي ٺھڻ کان صفحن ۾ ڪيل سموريون ترميمون",
        "statistics-edits-average": "سراسري ترميمون في صفحو",
        "statistics-users": "کاتيدار [[Special:ListUsers|يُوزرس]]",
        "statistics-users-active": "سرگرم يُوزرس",
        "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 dce7088..12051ab 100644 (file)
        "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..eea4a6a 100644 (file)
@@ -12,7 +12,8 @@
                        "KWiki",
                        "Matma Rex",
                        "Srdjan m",
-                       "Conquistador"
+                       "Conquistador",
+                       "Xð"
                ]
        },
        "tog-underline": "Podvuci linkove:",
        "unprotectthispage": "Promijeni zaštitu za ovu stranicu",
        "newpage": "Nova stranica / Нова страница",
        "talkpage": "Razgovaraj o ovoj stranici - Разговарај о овој страници",
-       "talkpagelinktext": "Razgovor",
+       "talkpagelinktext": "razgovor",
        "specialpage": "Posebna stranica",
        "personaltools": "Lični alati",
        "articlepage": "Vidi stranicu sadržaja",
        "internalerror_info": "Interna greška: $1",
        "internalerror-fatal-exception": "Fatalna greška tipa \"$1\"",
        "filecopyerror": "Ne može se kopirati \"$1\" na \"$2\".",
-       "filerenameerror": "Ne može se promjeniti ime datoteke \"$1\" u \"$2\".",
+       "filerenameerror": "Ne mogu preimenovati datoteku \"$1\" u \"$2\".",
        "filedeleteerror": "Ne može se izbrisati datoteka \"$1\".",
        "directorycreateerror": "Nije moguće napraviti direktorijum \"$1\".",
        "directoryreadonlyerror": "Direktorij \"$1\" je samo za čitanje.",
        "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..13fa595 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ජාවා ගොනු උඩුගත කිරීම සදහා අවසර ලබා නොදේ, මන්ද ඒවා ආරක්ෂිත අවහිරතා මගහැර යාමට හේතු විය හැක.",
        "sp-contributions-search": "දායකත්ව පිළිබඳ ගවේෂණය කරන්න",
        "sp-contributions-username": "පරිශීලක නාමය හෝ IP ලිපිනය:",
        "sp-contributions-toponly": "නවතම අනුවාදයන් වන සංස්කරණයන් පමණක් පෙන්වයි",
+       "sp-contributions-newonly": "පිටු නිර්මාණය කිරීම් වන සංස්කරණ පමණක් පෙන්වන්න",
        "sp-contributions-submit": "සොයන්න",
        "whatlinkshere": "මෙතනට සබැඳෙන්නේ කුමක්ද",
        "whatlinkshere-title": "\"$1\" වෙත සබැ‍ඳෙන පිටු",
        "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 c8103b6..e16e746 100644 (file)
@@ -34,7 +34,8 @@
                        "Mikulas1",
                        "Hromoslav",
                        "Matma Rex",
-                       "LacoR"
+                       "LacoR",
+                       "Xð"
                ]
        },
        "tog-underline": "Podčiarkovať odkazy:",
        "unprotectthispage": "Zmeniť stav ochrany tejto stránky",
        "newpage": "Nová stránka",
        "talkpage": "Diskusia k stránke",
-       "talkpagelinktext": "Diskusia",
+       "talkpagelinktext": "diskusia",
        "specialpage": "Špeciálna stránka",
        "personaltools": "Osobné nástroje",
        "articlepage": "Zobraziť stránku",
        "saveprefs": "Uložiť nastavenia",
        "restoreprefs": "Obnoviť všetky predvolené nastavenia (vo všetkých sekciách)",
        "prefs-editing": "Úpravy",
-       "rows": "Riadky:",
-       "columns": "Stĺpce:",
        "searchresultshead": "Vyhľadávanie",
        "stub-threshold": "Prah formátovania odkazu ako výhonok ($1):",
        "stub-threshold-sample-link": "príklad",
        "feedback-useragent": "Prehliadač:",
        "searchsuggest-search": "Hľadať",
        "searchsuggest-containing": "obsahuje...",
-       "api-error-autoblocked": "Vaše IP adresa bola automaticky zablokovaná, pretože ju používal zablokovaný používateľ.",
-       "api-error-badaccess-groups": "Nemáte oprávnenie nahrávať súbory na tejto wiki.",
        "api-error-badtoken": "Vnútorná chyba: Zlý token.",
-       "api-error-blocked": "Možnosť editovať vám bola zablokovaná.",
-       "api-error-copyuploaddisabled": "Nahrávanie z URL je na tomto serveri zakázané.",
-       "api-error-duplicate": "{{PLURAL:$1|ďalší súbor|ďalšie súbory}} s rovnakým obsahom už na tejto wiki existujú",
-       "api-error-duplicate-archive": "{{PLURAL:$1|ďalší súbor|ďalšie súbory}} s rovnakým obsahom už na tejto wiki existoval, ale {{PLURAL:$1|bol zmazaný|boli zmazané}}.",
-       "api-error-empty-file": "Súbor, ktorý ste poslali bol prázdny.",
        "api-error-emptypage": "Vytváranie nových, prázdnych stránok nie je dovolené.",
-       "api-error-fetchfileerror": "Vnútorná chyba: Niečo pokazilo počas sťahovania súboru.",
-       "api-error-fileexists-forbidden": "Súbor s názvom „$1“ už existuje a nie je možné prepísať ho.",
-       "api-error-fileexists-shared-forbidden": "Súbor s názvom „$1“ už neexistuje v repozitári zdieľaných súborov a nie je možné prepísať ho.",
-       "api-error-file-too-large": "Súbor, ktorý ste poslali bol príliš veľký.",
-       "api-error-filename-tooshort": "Názov súboru je príliš krátky.",
-       "api-error-filetype-banned": "Tento typ súboru je zakázaný.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nie je povolený typ súboru|nie sú povolené typy súboru}}. {{PLURAL:$3|Povolený typ súborov je|Povolené typy súborov sú}} $2.",
-       "api-error-filetype-missing": "Súboru chýba prípona.",
-       "api-error-hookaborted": "Zmena, ktorú ste sa pokúsili vykonať bola zrušená prípojným bodom rozšírenia.",
-       "api-error-http": "Vnútorná chyba: Nepodarilo sa pripojiť k serveru.",
-       "api-error-illegal-filename": "Názov súboru nie je povolený.",
-       "api-error-internal-error": "Vnútorná chyba: Niečo pokazilo pri spracovaní súboru, ktorý ste nahrávali na wiki.",
-       "api-error-invalid-file-key": "Vnútorná chyba: Súbor sa nenašiel v dočasnom úložisku.",
-       "api-error-missingparam": "Vnútorná chyba: Chýbajú parametre požiadavky.",
-       "api-error-missingresult": "Vnútorná chyba: Nepodarilo sa určiť, či kopírovanie prebehlo úspešne.",
-       "api-error-mustbeloggedin": "Aby ste mohli nahrávať súbory, musíte sa prihlásiť",
-       "api-error-mustbeposted": "Vnútorná chyba: Požiadavka vyžaduje HTTP POST.",
-       "api-error-noimageinfo": "Nahranie sa podarilo, ale server nám nedal žiadne informácie o súbore.",
-       "api-error-nomodule": "Vnútorná chyba: Nebol nastavený žiaden nahrávací modul.",
-       "api-error-ok-but-empty": "Vnútorná chyba: Žiadna odpoveď zo servera.",
-       "api-error-overwrite": "Prepísanie existujúceho súboru nie je povolené.",
-       "api-error-stashfailed": "Vnútorná chyba: Serveru sa nepodarilo uložiť dočasný súbor.",
        "api-error-publishfailed": "Vnútorná chyba: Serveru sa nepodarilo publikovať dočasný súbor.",
-       "api-error-timeout": "Server neodpovedal v očakávanom čase.",
-       "api-error-unclassified": "Vyskytla sa neznáma chyba.",
-       "api-error-unknown-code": "Neznáma chyba: „$1“",
-       "api-error-unknown-error": "Vnútorná chyba: Niečo pokazilo pri pokuse nahrať váš súbor.",
+       "api-error-stashfailed": "Vnútorná chyba: Serveru sa nepodarilo uložiť dočasný súbor.",
        "api-error-unknown-warning": "Neznáme upozornenie: $1",
        "api-error-unknownerror": "Neznáma chyba: „$1“",
-       "api-error-uploaddisabled": "Nahrávanie je na tejto wiki zakázané.",
-       "api-error-verification-error": "Tento súbor môže byť poškodený, alebo má zlú príponu.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekundy|sekúnd}}",
        "duration-minutes": "$1 {{PLURAL:$1|minúta|minúty|minút}}",
        "duration-hours": "$1 {{PLURAL:$1|hodina|hodiny|hodín}}",
index a3dfa1c..7ddeba7 100644 (file)
@@ -13,7 +13,8 @@
                        "Skalcaa",
                        "Janezdrilc",
                        "Matma Rex",
-                       "NegativeTwelveDollars"
+                       "NegativeTwelveDollars",
+                       "Xð"
                ]
        },
        "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",
        "unprotectthispage": "Spremeni zaščito strani",
        "newpage": "Nova stran",
        "talkpage": "Pogovorite se o strani",
-       "talkpagelinktext": "Pogovor",
+       "talkpagelinktext": "pogovor",
        "specialpage": "Posebna stran",
        "personaltools": "Osebna orodja",
        "articlepage": "Prikaže članek",
        "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",
        "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",
        "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",
        "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:",
        "editusergroup": "Naloži uporabniške skupine",
        "editinguser": "Urejanje pravic {{GENDER:$1|uporabnika|uporabnice}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Ogledovanje uporabniških pravic {{GENDER:$1|uporabnika|uporabnice}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Urejanje uporabniških skupin",
-       "userrights-viewusergroup": "Ogled skupin uporabnikov",
+       "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-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.",
        "group": "Skupina:",
        "group-user": "Uporabniki",
        "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-feedbacklink": "Podajte povratne informacije o novih (preizkusnih) filtrih",
+       "rcfilters-highlightbutton-title": "Označi rezultate",
+       "rcfilters-highlightmenu-title": "Izberite barvo",
+       "rcfilters-highlightmenu-help": "Izberite barvo za označitev te lastnosti",
        "rcfilters-filterlist-noresults": "Nismo našli nobenega filtra",
+       "rcfilters-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-params-json": "Parametri JSON:",
+       "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.",
        "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}}}}. {{GENDER:$2|Vaše}} e-poštno sporočilo bo poslano neposredno {{GENDER:$1|izvornemu pošiljatelju|izvorni pošiljateljici}}, kar {{GENDER:$1|mu|ji}} bo razkrilo {{GENDER:$2|vaš}} e-poštni naslov.",
+       "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",
        "editcomment": "Povzetek urejanja je bil: <em>$1</em>.",
        "revertpage": "vrnitev sprememb uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) na zadnje urejanje uporabnika [[User:$1|$1]]",
        "revertpage-nouser": "vrnitev sprememb skritega uporabnika na zadnjo redakcijo {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Razveljavljene spremembe uporabnika $1;\nvrnjeno na urejanje uporabnika $2.",
+       "rollback-success": "Razveljavljene spremembe {{GENDER:$3|uporabnika|uporabnice}} $1;\nvrnjeno na urejanje {{GENDER:$4|uporabnika|uporabnice}} $2.",
        "rollback-success-notify": "Povrnili smo urejanja $1;\nspremenjeno nazaj na zadnjo redakcijo $2. [$3 Prikaži spremembe]",
        "sessionfailure-title": "Neuspeh seje",
        "sessionfailure": "Vaša prijava ni uspela; da bi preprečili ugrabitev seje, je bilo dejanje preklicano. Prosimo, izberite »Nazaj« in ponovno naložite stran, s katere prihajate, nato poskusite znova.",
        "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",
        "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-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.",
        "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",
        "usercssispublic": "Pomnite: Podstrani CSS naj ne vsebujejo zaupnih podatkov, saj so vidne tudi drugim uporabnikom.",
        "restrictionsfield-badip": "Neveljaven IP-naslov ali obseg: $1",
        "restrictionsfield-label": "Dovoljeni IP-obsegi:",
-       "restrictionsfield-help": "En IP-naslov ali CIDR-območje na vrstico. Da omogočite vse, uporabite<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "En IP-naslov ali CIDR-območje na vrstico. Da omogočite vse, uporabite:\n<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "redakcija $1",
        "pageid": "ID strani $1"
 }
index bc98608..9268049 100644 (file)
        "searcharticle": "Shko",
        "history": "Historiku i faqes",
        "history_short": "Historiku",
+       "history_small": "historiku",
        "updatedmarker": "përditësuar që nga vizita ime e fundit",
        "printableversion": "Versioni i printueshëm",
        "permalink": "Lidhje e përhershme",
        "nocookieslogin": "{{SITENAME}} shfrytëzon \"cookies\" për identifikimin e përdoruesve.\nYou nuk lejoni shfrytëzimin e \"cookies\".\nJu lutemi, lejoni shfrytëzimin e \"cookies\" dhe provojeni përsëri.",
        "nocookiesfornew": "Llogaria e përdoruesit nuk u krijua, pasi ne nuk mund të konfirmojmë burimin e tij.\nSigurohuni që ju lejoni shfrytëzimin e \"cookies\", rifreskoni këtë faqe dhe provojen përsëri.",
        "noname": "Nuk keni dhënë një emër përdoruesi të pranueshëm.",
-       "loginsuccesstitle": "Identifikim i suksesshëm",
+       "loginsuccesstitle": "I/e identifikuar",
        "loginsuccess": "'''Ju tani jeni identifikuar tek {{SITENAME}} si \"$1\".'''",
        "nosuchuser": "Nuk ka ndonjë përdorues me emrin \"$1\".\nKontrolloni shkrimin ose [[Special:CreateAccount|hapni një llogari të re]].",
        "nosuchusershort": "Nuk ka asnjë përdorues me emrin \"$1\".",
        "saveprefs": "Ruaj parapëlqimet",
        "restoreprefs": "Rikthe të gjitha të dhënat e mëparshme",
        "prefs-editing": "Redaktimi",
-       "rows": "Rreshta:",
-       "columns": "Kollona:",
        "searchresultshead": "Kërkimi",
        "stub-threshold": "Kufiri për formatin e <a href=\"#\" class=\"stub\">lidhjeve cung</a> (B):",
        "stub-threshold-sample-link": "shembull",
        "feedback-thanks-title": "Ju faleminderit!",
        "searchsuggest-search": "Kërko",
        "searchsuggest-containing": "përmban ...",
-       "api-error-badaccess-groups": "Ju nuk lejoheni të ngarkoni skeda në këtë wiki.",
        "api-error-badtoken": "Gabim i brendshëm: Shenjë e keqe.",
-       "api-error-copyuploaddisabled": "Ngarkimi nga URL-ja është çaktivizuar në këtë server.",
-       "api-error-duplicate": "{{PLURAL:$1|Ekziston një skedë tjetër|Ekzistojnë disa skeda të tjera}} me të njëjtën përmbajtje.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Ekzistonte një skedë tjetër|Ekzistonin disa skeda të tjera}} me të njëjtën përmbajtje, por {{PLURAL:$1|ajo është|ato janë}} fshirë.",
-       "api-error-empty-file": "Skeda që paraqitët ishte bosh.",
        "api-error-emptypage": "Nuk lejohet krijimi i faqeve të reja bosh.",
-       "api-error-fetchfileerror": "Gabim i brendshëm: Diçka shkoi keq gjatë marrjes së skedës.",
-       "api-error-fileexists-forbidden": "Një skedar me emrin \"$1\" tashmë ekziston dhe nuk mund të mbishkruhet.",
-       "api-error-fileexists-shared-forbidden": "Një skedar me emrin \"$1\" tashmë ekziston në depon për skedarët e shpërndarë dhe nuk mund të mbishkruhet.",
-       "api-error-file-too-large": "Skeda që paraqitët ishte shumë e madhe.",
-       "api-error-filename-tooshort": "Emri i skedës është shumë i shkurtër.",
-       "api-error-filetype-banned": "Ky lloj i skedës është përjashtuar.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nuk është një lloj i skedës së lejuar|nuk janë lloje të lejuara të skedave}}. {{PLURAL:$3|Lloji i lejuar i skedës është|Llojet e lejuara të skedave janë}} $2.",
-       "api-error-filetype-missing": "Skedës i mungon një shtesë.",
-       "api-error-hookaborted": "Modifikimi që provuat të bëni u ndërpre nga një goditje shtese.",
-       "api-error-http": "Gabim i brendshëm: Nuk mund të lidhet me serverin.",
-       "api-error-illegal-filename": "Emri i skedës nuk lejohet.",
-       "api-error-internal-error": "Gabim i brendshëm: Diçka shkoi keq me procesimin e ngarkimit tuaj në wiki.",
-       "api-error-invalid-file-key": "Gabim i brendshëm: Skeda nuk u gjet në ruajtjen e përkohshme.",
-       "api-error-missingparam": "Gabim i brendshëm: Mungesë e parametrave në kërkesë.",
-       "api-error-missingresult": "Gabim i brendshëm: Nuk mund të përcaktohet nëse kopjimi doli me sukses.",
-       "api-error-mustbeloggedin": "Ju duhet të identifikoheni për të ngarkuar skeda.",
-       "api-error-mustbeposted": "Gabim i brendshëm: Kërkesa kërkon HTTP POST.",
-       "api-error-noimageinfo": "Ngarkimi u krye me sukses, por serveri nuk na dha ndonjë informacion për këtë skedë.",
-       "api-error-nomodule": "Gabim i brendshëm: Nuk ka modul ngarkimi të vendosur.",
-       "api-error-ok-but-empty": "Gabim i brendshëm: Nuk ka përgjigje nga serveri.",
-       "api-error-overwrite": "Mbishkrimi i një skede ekzistuese nuk lejohet.",
        "api-error-stashfailed": "Gabim i brendshëm: Serveri nuk arriti të ruajë skedën e përkohshme.",
-       "api-error-timeout": "Serveri nuk u përgjigj gjatës kohës që pritej.",
-       "api-error-unclassified": "Një gabim i panjohur ndodhi.",
-       "api-error-unknown-code": "Gabim i panjohur: \"$1\"",
-       "api-error-unknown-error": "Gabim i brendshëm: Diçka shkoi gabim kur provuat të ngarkoni skedën tuaj.",
        "api-error-unknown-warning": "Paralajmërim i panjohur: $1",
        "api-error-unknownerror": "Gabim i papërcaktuar: \"$1\".",
-       "api-error-uploaddisabled": "Ngarkimi është i çaktivizuar në këte wiki.",
-       "api-error-verification-error": "Skeda mund të jetë e korruptuar ose ka shtesë të gabuar.",
        "duration-seconds": "$1 {{PLURAL:$1|sekondë|sekonda}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutë|minuta}}",
        "duration-hours": "$1 {{PLURAL:$1|orë|orë}}",
index 729b09d..9078ecf 100644 (file)
@@ -31,7 +31,8 @@
                        "Macofe",
                        "Сербијана",
                        "Xð",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Zoranzoki21"
                ]
        },
        "tog-underline": "Подвлачење веза:",
        "searcharticle": "Иди",
        "history": "Историја странице",
        "history_short": "Историја",
+       "history_small": "историја",
        "updatedmarker": "ажурирано од моје последње посете",
        "printableversion": "За штампање",
        "permalink": "Трајна веза",
        "virus-scanfailed": "неуспешно скенирање (код $1)",
        "virus-unknownscanner": "непознати антивирус:",
        "logouttext": "<strong>Одјављени сте.</strong>\n\nИмајте на уму да неке странице могу наставити да се приказују као да сте још пријављени, све док не очистите привремену меморију свог прегледача.",
+       "cannotlogoutnow-title": "Одјава тренутно није могућа",
+       "cannotlogoutnow-text": "Одјава није могућа током употребе $1.",
        "welcomeuser": "Добро дошли, $1!",
        "welcomecreation-msg": "Ваш налог је отворен.\nНе заборавите да промените своја [[Special:Preferences|подешавања]].",
        "yourname": "Корисничко име:",
        "password-change-forbidden": "Не можете да промените лозинку на овом викију.",
        "externaldberror": "Дошло је до грешке при препознавању базе података или немате овлашћења да ажурирате свој спољни налог.",
        "login": "Пријави ме",
-       "login-security": "Ð\92аеÑ\80иÑ\84икаÑ\86иÑ\98а Ð²Ð°Ñ\88ег Ð¸Ð½Ð´ÐµÐ½Ñ\82иÑ\82еÑ\82а",
+       "login-security": "Верификација вашег индентитета",
        "nav-login-createaccount": "Пријава/регистрација",
        "userlogin": "Пријава/регистрација",
        "userloginnocreate": "Пријава",
        "changepassword-success": "Ваша лозинка је успешно промењена!",
        "changepassword-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
        "botpasswords": "Лозинке ботова",
+       "botpasswords-disabled": "Лозинке ботова су онемогућене.",
        "botpasswords-label-appid": "Име бота:",
        "botpasswords-label-create": "Направи",
        "botpasswords-label-update": "Ажурирај",
        "hr_tip": "Водоравна линија (користити ретко)",
        "summary": "Опис измене:",
        "subject": "Тема:",
-       "minoredit": "мања измена",
-       "watchthis": "надгледај ову страницу",
+       "minoredit": "Ð\9eво Ñ\98е Ð¼Ð°Ñ\9aа Ð¸Ð·Ð¼ÐµÐ½Ð°",
+       "watchthis": "Ð\9dадгледај ову страницу",
        "savearticle": "Сачувај страницу",
        "savechanges": "Сачувај измене",
        "publishpage": "Објави страницу",
        "selfredirect": "<strong>Упозорење:</strong> преусмеравате ову страницу на њу саму.\nМожда вам је одредишна страница погрешна или уређујете погрешну страницу.\nАко још једном притиснете „{{int:savearticle}}“ преусмерење ће свеједно бити направљено.",
        "missingcommenttext": "Унесите коментар испод.",
        "missingcommentheader": "<strong>Напомена:</strong> нисте унели наслов овог коментара.\nАко поново кликнете на „{{int:savearticle}}“, ваша измена ће бити сачувана без наслова.",
-       "summary-preview": "Преглед описа:",
+       "summary-preview": "Преглед описа измене:",
        "subject-preview": "Преглед теме:",
        "previewerrortext": "Догодила се грешка приликом приказивања ваших измена.",
        "blockedtitle": "Корисник је блокиран",
        "nonunicodebrowser": "'''Упозорење: ваш прегледач не подржава уникод.'''\nПромените га пре него што почнете с уређивањем.",
        "editingold": "<strong>Упозорење: уређујете застарелу измену ове странице.</strong>\nАко је сачувате, све новије измене ће бити изгубљене.",
        "yourdiff": "Разлике",
-       "copyrightwarning": "Имајте на уму да се сви доприноси на овом викију сматрају као објављени под лиценцом $2 (више на $1).\nАко не желите да се ваши текстови мењају и размењују без ограничења, онда их не шаљите овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву.\n'''Не шаљите радове заштићене ауторским правима без дозволе!'''",
-       "copyrightwarning2": "Имајте на уму да се сви доприноси на овом викију могу мењати, враћати или брисати од других корисника.\nАко не желите да се ваши текстови слободно мењају и расподељују, не шаљите их овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву (више на $1).\n'''Не шаљите радове заштићене ауторским правима без дозволе!'''",
+       "copyrightwarning": "Имајте на уму да се сви доприноси на овом викију сматрају као објављени под лиценцом $2 (више на $1).\nАко не желите да се ваши текстови мењају и размењују без ограничења, онда их не шаљите овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву.\n<strong>Не шаљите радове заштићене ауторским правима без дозволе!</strong>",
+       "copyrightwarning2": "Имајте на уму да се сви доприноси на овом викију могу мењати, враћати или брисати од других корисника.\nАко не желите да се ваши текстови слободно мењају и расподељују, не шаљите их овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву (више на $1).\n<strong>Не шаљите радове заштићене ауторским правима без дозволе!</strong>",
        "editpage-cannot-use-custom-model": "Модел садржаја ове странице се не може променити.",
        "longpageerror": "'''Грешка: текст који сте унели је величине {{PLURAL:$1|један килобајт|$1 килобајта|$1 килобајта}}, што је веће од {{PLURAL:$2|дозвољеног једног килобајта|дозвољена $2 килобајта|дозвољених $2 килобајта}}.'''\nСтраница не може бити сачувана.",
        "readonlywarning": "<strong>Упозорење: база података је закључана ради одржавања, тако да тренутно нећете моћи да сачувате измене.</strong>\nМожда бисте желели сачувати текст за касније у некој текстуалној датотеци.\n\nСистемски администратор је навео следеће објашњење: $1",
        "last": "разл",
        "page_first": "прва",
        "page_last": "последња",
-       "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: <strong>({{int:cur}})</strong> – разлика с тренутном изменом,\n<strong>({{int:last}})</strong> – разлика с претходном изменом, <strong>{{int:minoreditletter}}</strong> – мала измена",
+       "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: <strong>({{int:cur}})</strong> = разлика с тренутном изменом, <strong>({{int:last}})</strong> = разлика с претходном изменом, <strong>{{int:minoreditletter}}</strong> = мала измена",
        "history-fieldset-title": "Преглед историје",
        "history-show-deleted": "Само обрисано",
        "histfirst": "најстарије",
        "difference-multipage": "(разлике између страница)",
        "lineno": "Ред $1:",
        "compareselectedversions": "Упореди изабране измене",
-       "showhideselectedversions": "Ð\9fÑ\80икажи/Ñ\81акÑ\80иÑ\98 Ð¸Ð·Ð°Ð±Ñ\80ане Ð¸Ð·Ð¼ÐµÐ½Ðµ",
+       "showhideselectedversions": "Ð\9fÑ\80омени Ð²Ð¸Ð´Ñ\99ивоÑ\81Ñ\82 Ð¸Ð·Ð°Ð±Ñ\80аниÑ\85 Ð¸Ð·Ð¼ÐµÐ½Ð°",
        "editundo": "поништи",
        "diff-empty": "(Нема разлике)",
        "diff-multi-sameuser": "({{PLURAL:$1|Једна међуизмена истог корисника није приказана|$1 међуизмене истог корисника није приказано|$1 међуизмена истог корисника није приказано}})",
        "powersearch-legend": "Напредна претрага",
        "powersearch-ns": "Тражи у следећим именским просторима:",
        "powersearch-togglelabel": "Изабери:",
-       "powersearch-toggleall": "све",
-       "powersearch-togglenone": "ништа",
+       "powersearch-toggleall": "Све",
+       "powersearch-togglenone": "Ð\9dишта",
        "powersearch-remember": "Запамти мој избор за будуће претраге",
        "search-external": "Спољна претрага",
        "searchdisabled": "Претрага је онемогућена.\nУ међувремену можете тражити преко Гугла.\nУпамтите да његови пописи овог викија могу бити застарели.",
        "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)",
        "prefswarning-warning": "Променили сте ваша подешавања али нисте их још сачували.\nАко не притиснете „$1“ ваша подешавања ће бити изгубљена.",
        "prefs-tabs-navigation-hint": "Савет: можете користити типке са левом и десном стрелицом за кретање кроз картице.",
        "userrights": "Управљање корисничким правима",
-       "userrights-lookup-user": "УпÑ\80авÑ\99аÑ\9aе ÐºÐ¾Ñ\80иÑ\81ниÑ\87ким Ð³Ñ\80Ñ\83пама",
+       "userrights-lookup-user": "Ð\98забеÑ\80и ÐºÐ¾Ñ\80иÑ\81ника",
        "userrights-user-editname": "Корисничко име:",
-       "editusergroup": "УÑ\80еди {{GENDER:$1|коÑ\80иÑ\81ниÑ\87ке}} групе",
+       "editusergroup": "УÑ\87иÑ\82аÑ\98 ÐºÐ¾Ñ\80иÑ\81ниÑ\87ке групе",
        "editinguser": "Мењате корисничка права {{GENDER:$1|корисника|кориснице}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Корисничка права {{GENDER:$1|корисника|кориснице}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Промена корисничких група",
-       "userrights-viewusergroup": "Преглед корисничких група",
+       "userrights-editusergroup": "Промена {{GENDER:$1|корисничких}} група",
+       "userrights-viewusergroup": "Преглед {{GENDER:$1|корисничких}} група",
        "saveusergroups": "Сачувај {{GENDER:$1|корисничке}} групе",
        "userrights-groupsmember": "Члан:",
        "userrights-groupsmember-auto": "Подразумевано члан и:",
-       "userrights-groups-help": "Можете променити групе којима овај корисник припада.\n* Означен квадратић означава да се корисник налази у тој групи.\n* Неозначен квадратић означава да се корисник не налази у тој групи.\n* Звездица означава да не можете уклонити групу ако је додате и обратно.",
+       "userrights-groups-help": "Можете променити групе којима овај корисник припада.\n* Означен квадратић означава да се корисник налази у тој групи.\n* Неозначен квадратић означава да се корисник не налази у тој групи.\n* Звездица (*) означава да не можете уклонити групу ако је додате и обратно.\n* Тараба (#) означава да једино можете одложити време истека ове групе; не можете га убрзати.",
        "userrights-reason": "Разлог:",
        "userrights-no-interwiki": "Немате овлашћења да мењате корисничка права на другим викијима.",
        "userrights-nodatabase": "База података $1 не постоји или није локална.",
        "action-upload_by_url": "отпремање ове датотеке преко веб-адресе",
        "action-writeapi": "писање АПИ-ја",
        "action-delete": "брисање ове странице",
-       "action-deleterevision": "бÑ\80иÑ\81аÑ\9aе Ð¾Ð²Ðµ Ð¸Ð·Ð¼ÐµÐ½Ðµ",
-       "action-deletedhistory": "прегледање обрисане историје ове странице",
+       "action-deleterevision": "бÑ\80иÑ\81аÑ\9aе Ð¸Ð·Ð¼ÐµÐ½Ð°",
+       "action-deletedhistory": "прегледање обрисане историје странице",
        "action-browsearchive": "претраживање обрисаних страница",
-       "action-undelete": "враћање ове странице",
-       "action-suppressrevision": "прегледање и враћање ове сакривене измене",
+       "action-undelete": "враћање страница",
+       "action-suppressrevision": "прегледање и враћање сакривених измена",
        "action-suppressionlog": "прегледање ове приватне историје",
        "action-block": "блокирање даљих измена овог корисника",
        "action-protect": "мењање степена заштите ове странице",
        "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": "!",
        "recentchangeslinked-page": "Назив странице:",
        "recentchangeslinked-to": "Прикажи измене страница које су повезане с датом страницом",
        "recentchanges-page-added-to-category": "[[:$1]] је додата у категорију",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] и још [[Special:WhatLinksHere/$1|{{PLURAL:$2|једна страница|$2 странице}}]] су додате у категорију",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] је додана у категорију, [[Special:WhatLinksHere/$1|ова страница је повезана са другим страницама]]",
        "recentchanges-page-removed-from-category": "[[:$1]] је уклоњена из категорије",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] и још [[Special:WhatLinksHere/$1|{{PLURAL:$2|једна страница|$2 странице}}]] су уклоњене из категорије",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] је уклоњена из категорије, [[Special:WhatLinksHere/$1|ова страница је повезана са другим страницама]]",
        "autochange-username": "Медијавики аутоматска измена",
        "upload": "Отпреми датотеку",
        "uploadbtn": "Отпреми датотеку",
        "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.",
        "booksources-search": "Претражи",
        "booksources-text": "Испод се налази списак веза ка сајтовима који се баве продајом нових и половних књига, а који би могли имати додатне податке о књигама које тражите:",
        "booksources-invalid-isbn": "Наведени ISBN број није исправан. Проверите да није дошло до грешке при умножавању из првобитног извора.",
+       "magiclink-tracking-isbn": "Странице са ISBN магичним везама",
        "specialloguserlabel": "Извршилац:",
        "speciallogtitlelabel": "Циљ (наслов или {{ns:user}}:корисничко име):",
        "log": "Дневници",
        "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",
-       "checkbox-all": "све",
-       "checkbox-none": "ништа",
-       "checkbox-invert": "обрни",
+       "checkbox-all": "Све",
+       "checkbox-none": "Ð\9dишта",
+       "checkbox-invert": "Ð\9eбрни",
        "allpages": "Све странице",
        "nextpage": "Следећа страница ($1)",
        "prevpage": "Претходна страница ($1)",
        "emailccsubject": "Копија ваше поруке кориснику $1: $2",
        "emailsent": "Имејл је послат",
        "emailsenttext": "Ваша имејл порука је послата.",
-       "emailuserfooter": "Овај имејл је {{GENDER:$1|послао|послала}} $1 {{GENDER:$2|кориснику|корисници}} $2 помоћу „{{int:emailuser}}“ с викија {{SITENAME}}.",
+       "emailuserfooter": "Овај имејл је {{GENDER:$1|послао|послала}} $1 {{GENDER:$2|кориснику|корисници}} $2 помоћу „{{int:emailuser}}“ с викија {{SITENAME}}. Ако одговорите на овај имејл, {{GENDER:$2|Ваш}} имејл ће бити непосредно прослеђен ка {{GENDER:$1|првобитном пошиљаоцу}}, чиме ће те {{GENDER:$2|му|јој}} открити {{GENDER:$2|Вашу}} имејл адресу.",
        "usermessage-summary": "Слање системске поруке.",
        "usermessage-editor": "Уређивач системских порука",
        "usermessage-template": "MediaWiki:UserMessage",
        "editcomment": "Опис измене: <em>$1</em>.",
        "revertpage": "Враћене измене [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену корисника [[User:$1|$1]]",
        "revertpage-nouser": "Враћене су измене скривеног корисника на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
-       "rollback-success": "Враћене су измене {{GENDER:$1|корисника|кориснице}} $1\nна последњу измену {{GENDER:$2|корисника|кориснице}} $2.",
+       "rollback-success": "Враћене су измене {{GENDER:$1|корисника|кориснице}} {{GENDER:$3|$1}}\nна последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Сесија је окончана",
        "sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nВратите се на претходну страницу, поново је учитајте и покушајте поново.",
        "changecontentmodel": "Промени модел садржаја странице",
        "allmessages-filter-legend": "Филтер",
        "allmessages-filter": "Филтрирај по стању:",
        "allmessages-filter-unmodified": "неизмењене",
-       "allmessages-filter-all": "све",
+       "allmessages-filter-all": "Све",
        "allmessages-filter-modified": "измењене",
        "allmessages-prefix": "Филтрирај по префиксу:",
        "allmessages-language": "Језик:",
        "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",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 наслов је уклоњен|$1 наслова су уклоњена|$1 наслова је уклоњено}}:",
        "watchlistedit-too-many": "Има превише страница за приказ овде.",
        "watchlisttools-clear": "испразни списак надгледања",
-       "watchlisttools-view": "прикажи сродне измене",
+       "watchlisttools-view": "Ð\9fрикажи сродне измене",
        "watchlisttools-edit": "прикажи и уреди списак надгледања",
        "watchlisttools-raw": "измени сиров списак надгледања",
        "iranian-calendar-m1": "Фарвардин",
        "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-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.",
        "json-error-syntax": "Грешка у синтакси",
        "headline-anchor-title": "Веза до овог одељка",
        "special-characters-group-latin": "Латиница",
-       "special-characters-group-latinextended": "проширена латиница",
+       "special-characters-group-latinextended": "Ð\9fроширена латиница",
        "special-characters-group-ipa": "ИПА",
-       "special-characters-group-symbols": "симболи",
-       "special-characters-group-greek": "грчки",
-       "special-characters-group-cyrillic": "ћирилица",
-       "special-characters-group-arabic": "арапски",
-       "special-characters-group-arabicextended": "проширени арапски",
+       "special-characters-group-symbols": "Симболи",
+       "special-characters-group-greek": "Грчки",
+       "special-characters-group-greekextended": "Проширени грчки",
+       "special-characters-group-cyrillic": "Ћирилица",
+       "special-characters-group-arabic": "Арапски",
+       "special-characters-group-arabicextended": "Проширени арапски",
        "special-characters-group-persian": "персијски",
-       "special-characters-group-hebrew": "хебрејски",
-       "special-characters-group-bangla": "бенгалски",
-       "special-characters-group-tamil": "тамилски",
-       "special-characters-group-telugu": "телугу",
-       "special-characters-group-sinhala": "синхалски",
-       "special-characters-group-gujarati": "гуџарати",
-       "special-characters-group-devanagari": "деванагари",
-       "special-characters-group-thai": "тајландски",
-       "special-characters-group-lao": "лаоски",
-       "special-characters-group-khmer": "кмерски",
+       "special-characters-group-hebrew": "Хебрејски",
+       "special-characters-group-bangla": "Ð\91енгалски",
+       "special-characters-group-tamil": "Тамилски",
+       "special-characters-group-telugu": "Телугу",
+       "special-characters-group-sinhala": "Синхалски",
+       "special-characters-group-gujarati": "Ð\93уџарати",
+       "special-characters-group-devanagari": "Ð\94еванагари",
+       "special-characters-group-thai": "Тајландски",
+       "special-characters-group-lao": "Ð\9bаоски",
+       "special-characters-group-khmer": "Ð\9aмерски",
        "mw-widgets-dateinput-no-date": "Датум није изабран",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "log-action-filter-protect": "Тип закључавања:",
        "log-action-filter-rights": "Тип промене корисничких права:",
        "log-action-filter-upload": "Тип отпремања:",
-       "log-action-filter-all": "све",
+       "log-action-filter-all": "Све",
        "log-action-filter-block-block": "блокирање",
        "log-action-filter-block-reblock": "измена блокирања",
        "log-action-filter-block-unblock": "деблокирање",
        "log-action-filter-managetags-activate": "активирање ознаке",
        "log-action-filter-managetags-deactivate": "деактивирање ознаке",
        "log-action-filter-move-move": "премештање без преснимавања преусмерења",
-       "log-action-filter-move-move_redir": "пÑ\80емеÑ\88Ñ\82аÑ\9aе Ñ\81а Ð¿Ñ\80еÑ\81нимавањем преусмерења",
+       "log-action-filter-move-move_redir": "Ð\9fÑ\80емеÑ\88Ñ\82аÑ\9aе Ñ\81а Ð¿Ñ\80епиÑ\81ивањем преусмерења",
        "log-action-filter-newusers-create": "отворио анониман корисник",
        "log-action-filter-newusers-create2": "отворио регистрован корисник",
        "log-action-filter-newusers-autocreate": "аутоматски отворен",
index 735e419..d1a3a20 100644 (file)
@@ -40,6 +40,7 @@
        "tog-watchdefault": "Dodaj stranice i datoteke koje izmenim u spisak nadgledanja",
        "tog-watchmoves": "Dodaj stranice i datoteke koje premestim u spisak nadgledanja",
        "tog-watchdeletion": "Dodaj stranice i datoteke koje obrišem u spisak nadgledanja",
+       "tog-watchuploads": "Dodaj datoteke koje otpremim u spisak nadgledanja",
        "tog-watchrollback": "Dodaj stranice na kojima sam vratio izmene u spisak nadgledanja",
        "tog-minordefault": "Označavaj sve izmene kao manje",
        "tog-previewontop": "Prikaži pregled pre okvira za uređivanje",
@@ -51,7 +52,7 @@
        "tog-shownumberswatching": "Prikaži broj korisnika koji nadgledaju",
        "tog-oldsig": "Tekući potpis:",
        "tog-fancysig": "Smatraj potpis kao vikitekst (bez samopovezivanja)",
-       "tog-uselivepreview": "Koristi trenutan pregled",
+       "tog-uselivepreview": "Koristi trenutni pregled",
        "tog-forceeditsummary": "Upozori me kada ne unesem opis izmene",
        "tog-watchlisthideown": "Sakrij moje izmene sa spiska nadgledanja",
        "tog-watchlisthidebots": "Sakrij izmene botova sa spiska nadgledanja",
@@ -64,7 +65,7 @@
        "tog-ccmeonemails": "Pošalji mi kopije imejlova koje pošaljem drugim korisnicima",
        "tog-diffonly": "Ne prikazuj sadržaj stranice ispod razlika",
        "tog-showhiddencats": "Prikaži skrivene kategorije",
-       "tog-norollbackdiff": "Izostavi razliku nakon izvršenog vraćanja",
+       "tog-norollbackdiff": "Ne prikazuj razliku nakon izvršenog vraćanja",
        "tog-useeditwarning": "Upozori me kada napuštam stranicu sa nesačuvanim promenama",
        "tog-prefershttps": "Uvek koristi sigurnu konekciju kada sam prijavljen.",
        "underline-always": "uvek podvlači",
        "hr_tip": "Vodoravna linija (koristiti retko)",
        "summary": "Opis izmene:",
        "subject": "Tema:",
-       "minoredit": "manja izmena",
-       "watchthis": "nadgledaj ovu stranicu",
+       "minoredit": "Ovo je manja izmena",
+       "watchthis": "Nadgledaj ovu stranicu",
        "savearticle": "Sačuvaj stranicu",
        "savechanges": "Sačuvaj izmene",
        "publishpage": "Objavi stranicu",
        "last": "razl",
        "page_first": "prva",
        "page_last": "poslednja",
-       "histlegend": "Izbor razlika: izaberite kutijice izmena za upoređivanje i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: <strong>({{int:cur}})</strong> – razlika s trenutnom izmenom,\n<strong>({{int:last}})</strong> – razlika s prethodnom izmenom, <strong>{{int:minoreditletter}}</strong> – mala izmena",
+       "histlegend": "Izbor razlika: izaberite kutijice izmena za upoređivanje i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: <strong>({{int:cur}})</strong> = razlika s trenutnom izmenom, <strong>({{int:last}})</strong> = razlika s prethodnom izmenom, <strong>{{int:minoreditletter}}</strong> = mala izmena",
        "history-fieldset-title": "Pregled istorije",
        "history-show-deleted": "Samo obrisane",
        "histfirst": "najstarije",
        "difference-multipage": "(razlike između stranica)",
        "lineno": "Red $1:",
        "compareselectedversions": "Uporedi izabrane izmene",
-       "showhideselectedversions": "Prikaži/sakrij izabrane izmene",
+       "showhideselectedversions": "Promeni vidljivost izabranih izmena",
        "editundo": "poništi",
        "diff-empty": "(Nema razlike)",
        "diff-multi-sameuser": "({{PLURAL:$1|Jedna međuizmena istog korisnika nije prikazana|$1 međuizmene istog korisnika nije prikazano|$1 međuizmena istog korisnika nije prikazano}})",
        "powersearch-legend": "Napredna pretraga",
        "powersearch-ns": "Traži u sledećim imenskim prostorima:",
        "powersearch-togglelabel": "Izaberi:",
-       "powersearch-toggleall": "sve",
-       "powersearch-togglenone": "ništa",
+       "powersearch-toggleall": "Sve",
+       "powersearch-togglenone": "Ništa",
        "powersearch-remember": "Zapamti moj izbor za buduće pretrage",
        "search-external": "Spoljna pretraga",
        "searchdisabled": "Pretraga je onemogućena.\nU međuvremenu možete tražiti preko Gugla.\nUpamtite da njegovi popisi ovog vikija mogu biti zastareli.",
        "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",
        "username": "{{GENDER:$1|Korisničko ime}}:",
        "prefs-memberingroups": "{{PLURAL:$1|Grupa|Grupe}}:",
        "prefs-memberingroups-type": "$1",
-       "prefs-registration": "Vreme upisa:",
+       "prefs-registration": "Vreme registracije:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Pravo ime:",
        "yourlanguage": "Jezik:",
        "hist": "ist",
        "hide": "Sakrij",
        "show": "Prikaži",
-       "minoreditletter": " m",
+       "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "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.",
        "booksources-search": "Pretraži",
        "booksources-text": "Ispod se nalazi spisak veza ka sajtovima koji se bave prodajom novih i polovnih knjiga, a koji bi mogli imati dodatne podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Navedeni ISBN broj nije ispravan. Proverite da nije došlo do greške pri umnožavanju iz prvobitnog izvora.",
+       "magiclink-tracking-isbn": "Stranice sa ISBN magičnim vezama",
        "specialloguserlabel": "Izvršilac:",
        "speciallogtitlelabel": "Cilj (naslov ili {{ns:user}}:korisničko ime):",
        "log": "Dnevnici",
        "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",
-       "checkbox-all": "sve",
-       "checkbox-none": "ništa",
-       "checkbox-invert": "obrni",
+       "checkbox-all": "Sve",
+       "checkbox-none": "Ništa",
+       "checkbox-invert": "Obrni",
        "allpages": "Sve stranice",
        "nextpage": "Sledeća stranica ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "allmessages-filter-legend": "Filter",
        "allmessages-filter": "Filtriraj po stanju:",
        "allmessages-filter-unmodified": "neizmenjene",
-       "allmessages-filter-all": "sve",
+       "allmessages-filter-all": "Sve",
        "allmessages-filter-modified": "izmenjene",
        "allmessages-prefix": "Filtriraj po prefiksu:",
        "allmessages-language": "Jezik:",
        "tooltip-watchlistedit-raw-submit": "Ažuriraj spisak",
        "tooltip-recreate": "Ponovo napravite stranicu iako je obrisana",
        "tooltip-upload": "Započnite otpremanje",
-       "tooltip-rollback": "Opcija „Vrati“ vraća izmene poslednjeg korisnika",
+       "tooltip-rollback": "„Vrati“ vraća izmene poslednjeg korisnika jednim klikom",
        "tooltip-undo": "Poništava ovu izmenu i otvara obrazac za uređivanje.",
        "tooltip-preferences-save": "Sačuvaj postavke",
        "tooltip-summary": "Unesite kratak opis",
        "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",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova su uklonjena|$1 naslova je uklonjeno}}:",
        "watchlistedit-too-many": "Ima previše stranica za prikaz ovde.",
        "watchlisttools-clear": "isprazni spisak nadgledanja",
-       "watchlisttools-view": "prikaži srodne izmene",
+       "watchlisttools-view": "Prikaži srodne izmene",
        "watchlisttools-edit": "prikaži i uredi spisak nadgledanja",
        "watchlisttools-raw": "izmeni sirov spisak nadgledanja",
        "iranian-calendar-m1": "Farvardin",
        "htmlform-user-not-exists": "<strong>$1</strong> ne postoji.",
        "htmlform-user-not-valid": "<strong>$1</strong> nije ispravno korisničko ime.",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
+       "logentry-delete-delete_redir": "$1 je {{GENDER:$2|obrisao|obrisala}} preusmerenje $3 prepisivanjem",
        "logentry-delete-restore": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3",
        "logentry-delete-event": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=događaja|$5 događaja}} u dnevniku $3: $4",
        "logentry-delete-revision": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=jedne izmene|$5 izmene|$5 izmena}} na stranici $3: $4",
        "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",
        "json-error-syntax": "Greška u sintaksi",
        "headline-anchor-title": "Veza do ovog odeljka",
        "special-characters-group-latin": "Latinica",
-       "special-characters-group-latinextended": "proširena latinica",
+       "special-characters-group-latinextended": "Proširena latinica",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Simboli",
-       "special-characters-group-greek": "grčki",
-       "special-characters-group-cyrillic": "ćirilica",
-       "special-characters-group-arabic": "arapski",
-       "special-characters-group-arabicextended": "prošireni arapski",
+       "special-characters-group-greek": "Grčki",
+       "special-characters-group-greekextended": "Prošireni grčki",
+       "special-characters-group-cyrillic": "Ćirilica",
+       "special-characters-group-arabic": "Arapski",
+       "special-characters-group-arabicextended": "Prošireni arapski",
        "special-characters-group-persian": "persijski",
-       "special-characters-group-hebrew": "jevrejsko",
-       "special-characters-group-bangla": "Bangla",
-       "special-characters-group-tamil": "tamilski",
-       "special-characters-group-telugu": "telugu",
-       "special-characters-group-sinhala": "sinhalski",
+       "special-characters-group-hebrew": "Hebrejski",
+       "special-characters-group-bangla": "Bengalski",
+       "special-characters-group-tamil": "Tamilski",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhalski",
        "special-characters-group-gujarati": "Gudžarati",
-       "special-characters-group-devanagari": "devanagari",
-       "special-characters-group-thai": "tajlandski",
-       "special-characters-group-lao": "laoski",
-       "special-characters-group-khmer": "kmerski",
+       "special-characters-group-devanagari": "Devanagari",
+       "special-characters-group-thai": "Tajlandski",
+       "special-characters-group-lao": "Laoski",
+       "special-characters-group-khmer": "Kmerski",
        "mw-widgets-dateinput-no-date": "Datum nije izabran",
        "mw-widgets-dateinput-placeholder-day": "GGGG-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "GGGG-MM",
        "mw-widgets-titleinput-description-new-page": "stranica još uvek ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmerava na $1",
        "randomrootpage": "Slučajna korenska stranica",
+       "log-action-filter-all": "Sve",
+       "log-action-filter-move-move_redir": "Premeštanje sa prepisivanjem preusmerenja",
        "log-action-filter-upload-upload": "Novo otpremanje",
        "authmanager-email-label": "Imejl",
        "authmanager-email-help": "Imejl adresa",
index 1a387b2..b9ae2be 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",
        "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.",
        "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",
        "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",
        "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:",
        "editusergroup": "Läs in användargrupper",
        "editinguser": "Ändrar rättigheter för {{GENDER:$1|användaren}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Visar rättigheter för {{GENDER:$1|användaren}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Ändra användargrupper",
-       "userrights-viewusergroup": "Visa användargrupper",
+       "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-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.",
        "group": "Grupp:",
        "group-user": "Användare",
        "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-feedbacklink": "Ge återkoppling på nya (beta)filter",
+       "rcfilters-highlightbutton-title": "Markera resultat",
+       "rcfilters-highlightmenu-title": "Välj en färg",
+       "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\".",
        "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}}. {{GENDER:$2|Ditt}} e-postmeddelande kommer att skickas direkt till {{GENDER:$1|den ursprungliga avsändaren}}, vilket kommer avslöja {{GENDER:$2|din}} e-postadress för {{GENDER:$1|honom|henne|hen}}.",
+       "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",
        "editcomment": "Redigeringskommentaren var: <em>$1</em>.",
        "revertpage": "Återställde redigeringar av  [[Special:Contributions/$2|$2]] ([[User talk:$2|användardiskussion]]) till senaste versionen av [[User:$1|$1]]",
        "revertpage-nouser": "Återställde redigeringar av en dold användare till den senaste versionen av {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Återställde ändringar av $1;\nändrade tillbaka till senaste version av $2.",
+       "rollback-success": "Återställde ändringar av {{GENDER:$3|$1}};\nändrade tillbaka till senaste versionen av {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Återställde ändringar av $1;\nändrade tillbaka till senaste sidversion av $2. [$3 Visa ändringar]",
        "sessionfailure-title": "Sessionsfel",
        "sessionfailure": "Något med din session som inloggad är på tok. Din begärda åtgärd har avbrutits, för att förhindra att någon kapar din session. Klicka på \"Tillbaka\" i din webbläsare och ladda om den sida du kom ifrån. Försök sedan igen.",
        "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",
        "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-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",
        "usercssispublic": "Observera: CSS-undersidor bör inte innehålla konfidentiella uppgifter eftersom de kan ses av andra användare.",
        "restrictionsfield-badip": "Ogiltig IP-adress eller intervall: $1",
        "restrictionsfield-label": "Tillåtna IP-intervall:",
-       "restrictionsfield-help": "En IP-adress eller CIDR-intervall per rad. För att aktivera allting, använd<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "En IP-adress eller CIDR-intervall per rad. För att aktivera allting, använd<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
        "revid": "sidversion $1",
        "pageid": "sid-ID $1"
 }
index 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 8d17d4d..1c99b9e 100644 (file)
@@ -69,6 +69,7 @@
        "tog-watchdefault": "நான் தொகுக்கும் பக்கங்கள் மற்றும் கோப்புகளை என் கவனிப்புப் பட்டியலில் சேர்",
        "tog-watchmoves": "நான் நகர்த்தும் பக்கங்கள் மற்றும் கோப்புகளை என் கவனிப்புப் பட்டியலில் சேர்.",
        "tog-watchdeletion": "நான் நீக்கும் பக்கங்கள் மற்றும் கோப்புகளை என் கவனிப்புப் பட்டியலில் சேர்",
+       "tog-watchuploads": "நான் பதிவேற்றும் புதிய கோப்புகளை எனது கவனிப்புப் பட்டியலில் சேர்க்கவும்",
        "tog-watchrollback": "நான் பின்மாற்றம் செய்த எனது கவனிப்பு பட்டியலில் பக்கங்களை சேர்",
        "tog-minordefault": "இயல்பிருப்பாக அனைத்து தொகுப்புகளையும் சிறியது எனக் குறித்துக்கொள்.",
        "tog-previewontop": "தொகுப்புப் பெட்டிக்கு முன்பு முன்தோற்றத்தைக் காட்டு",
@@ -93,7 +94,7 @@
        "tog-ccmeonemails": "ஏனைய பயனர்களுக்கு நான் அனுப்பும் மின்னஞ்சல்களின் நகலொன்றை எனக்கு அனுப்பு",
        "tog-diffonly": "மாற்றங்களை ஒப்பிடும் போது அதன் கீழ் பக்க உள்ளடக்கத்தைக் காட்டாதே",
        "tog-showhiddencats": "மறைக்கப்பட்ட பகுப்புகளைக் காட்டு",
-       "tog-norollbackdiff": "à®®à¯\81னà¯\8dபிரà¯\81நà¯\8dத à®¨à®¿à®²à¯\88à®\95à¯\8dà®\95à¯\81à®\95à¯\8d à®\95à¯\8aணà¯\8dà®\9fà¯\81வநà¯\8dதபினà¯\8d à®µà®¿à®¤à¯\8dதியாà®\9aà®\99à¯\8dà®\95ளà¯\88 à®µà®¿à®\9fà¯\8dà®\9fà¯\81விà®\9fவà¯\81à®®à¯\8d (à®\95ாà®\9fà¯\8dà®\9fதà¯\8dதà¯\87வà¯\88யிலà¯\8dலà¯\88).",
+       "tog-norollbackdiff": "à®®à¯\81னà¯\8dபிரà¯\81நà¯\8dத à®¨à®¿à®²à¯\88à®\95à¯\8dà®\95à¯\81à®\95à¯\8d à®\95à¯\8aணà¯\8dà®\9fà¯\81வநà¯\8dதபினà¯\8d à®µà®¿à®¤à¯\8dதியாà®\9aà®\99à¯\8dà®\95ளà¯\88 à®\95ாà®\9fà¯\8dà®\9fதà¯\8dதà¯\87வà¯\88யிலà¯\8dலà¯\88",
        "tog-useeditwarning": "தொகுத்துக் கொண்டிருக்கும் பக்கத்தை சேமிக்காமல் வெளியேறினால் எனக்கு எச்சரிக்கை செய்",
        "tog-prefershttps": "புகுபதிகை செய்யும்போது எப்போதுமே பாதுகாப்பான இணைப்பை பயன்படுத்தவும்",
        "underline-always": "எப்பொழுதும்",
        "searcharticle": "செல்",
        "history": "பக்க வரலாறு",
        "history_short": "வரலாறு",
+       "history_small": "வரலாறு",
        "updatedmarker": "எனது கடைசி வருகைக்குப் பின் இற்றைப்படுத்தப்பட்டது",
        "printableversion": "அச்சுக்குகந்த பதிப்பு",
        "permalink": "நிலையான இணைப்பு",
        "password-change-forbidden": "நீங்கள் விக்கிகளில் கடவுச் சொற்களை மாற்ற முடியாது",
        "externaldberror": "வெளி உறுதிப்படுத்தலில் ஏற்பட்ட தவறு காரணமாக உங்கள் வெளி கணக்கை இற்றைப்படுத்த முடியாது.",
        "login": "புகுபதிகை",
+       "login-security": "தங்கள் அடையாளத்தை உறுதிப்படுத்தவும்",
        "nav-login-createaccount": "புகுபதிகை/பயனர் கணக்கு தொடக்கம்",
        "userlogin": "புகுபதிகை/பயனர் கணக்கு தொடக்கம்",
        "userloginnocreate": "புகுபதிகை",
        "createacct-reason-ph": "தாங்கள் ஏன் மற்றொரு கணக்கைத் துவங்குகிறீர்கள்?",
        "createacct-submit": "உங்கள் கணக்கை உருவாக்குக",
        "createacct-another-submit": "கணக்கை உருவாக்கவும்",
+       "createacct-continue-submit": "கணக்கு தொடக்கத்தை தொடரவும்",
+       "createacct-another-continue-submit": "கணக்கு தொடக்கத்தை தொடரவும்",
        "createacct-benefit-heading": "{{SITENAME}} தங்களைப் போன்றோர்களால் உருவாக்கப்பட்டது",
        "createacct-benefit-body1": "{{PLURAL:$1|தொகுப்பு|தொகுப்புகள்}}",
        "createacct-benefit-body2": "{{PLURAL:$1|பக்கம்|பக்கங்கள்}}",
        "createacct-another-realname-tip": "உண்மையான பெயர் கட்டாயமற்றது.\nநீங்கள் இதை கொடுத்தால் உங்கள் ஆக்கங்களுக்கான உரிமையளிப்புகளின் போது இது பயன்படும்.",
        "pt-login": "உள்நுழை",
        "pt-login-button": "புகுபதிகை",
+       "pt-login-continue-button": "உள்நுழைவை தொடரவும்",
        "pt-createaccount": "புதிய கணக்கை உருவாக்கவும்",
        "pt-userlogout": "விடுபதிகை",
        "php-mail-error-unknown": "PHP 's mail() செயல்பாட்டில் அறியப்படாத பிழை.",
        "newpassword": "புதிய கடவுச்சொல்:",
        "retypenew": "புதிய கடவுச்சொல்லை மீண்டும் தட்டச்சிடு",
        "resetpass_submit": "கடவுச்சொல்லை பதிவுசெய்து புகுபதிகை செய்",
-       "changepassword-success": "à®\89à®\99à¯\8dà®\95ளதà¯\81 à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®µà¯\86à®±à¯\8dறிà®\95ரமாà®\95 à®®à®¾à®±à¯\8dறபà¯\8dபà®\9fà¯\8dà®\9fà¯\81ளà¯\8dளது!",
+       "changepassword-success": "à®\89à®\99à¯\8dà®\95ளà¯\8d à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®®à®¾à®±à¯\8dறபà¯\8dபà®\9fà¯\8dà®\9fது!",
        "changepassword-throttled": "தாங்கள் மிக அண்மையில் பலமுறை புகுபதிகை செய்ய முயற்சி செய்துள்ளீர்கள்.\nமீண்டும் முயற்சிக்கும் முன் $1 காத்திருக்கவும்.",
        "botpasswords": "தானியங்கி கடவுச்சொற்கள்",
        "botpasswords-disabled": "தானியங்கி கடவுச்சொற்கள் பயன்பாட்டில் இல்லை.",
        "botpasswords-insert-failed": "\"$1\" என்ற தானியங்கி பெயரை இணைக்க முடியவில்லை. ஏற்கனவே இருக்குமோ?",
        "botpasswords-update-failed": "\"$1\" என்ற தானியங்கி பெயரை புதிப்பிக்க முடியவில்லை. அது நீக்கப்பட்டதா?",
        "botpasswords-created-title": "தானியங்கி கடவுச்சொல் உருவாக்கப்பட்டது.",
-       "botpasswords-created-body": "\"$1\"-க்கான தானியங்கி கடவுச்சொல் முழுமையாக உருவாக்கப்பட்டது.",
+       "botpasswords-created-body": "\"$2\" பயனரின் \"$1\"-க்கான தானியங்கி கடவுச்சொல் முழுமையாக உருவாக்கப்பட்டது.",
        "botpasswords-updated-title": "தானியங்கி கடவுச்சொல் புதுப்பிக்கப்பட்டது",
-       "botpasswords-updated-body": "\"$1\" தானியங்கி கடவுச்சொல் முழுமையாக புதிப்பிக்கப்பட்டது.",
+       "botpasswords-updated-body": "\"$2\" பயனரின் \"$1\" தானியங்கி கடவுச்சொல் முழுமையாக புதிப்பிக்கப்பட்டது.",
        "botpasswords-deleted-title": "தானியங்கி கடவுச்சொல் நீக்கப்பட்டது",
-       "botpasswords-deleted-body": "\"$1\"-க்கான தானியங்கி கடவுச்சொல் நீக்கப்பட்டது.",
+       "botpasswords-deleted-body": "\"$2\" பயனரின் \"$1\"-க்கான தானியங்கி கடவுச்சொல் நீக்கப்பட்டது.",
        "botpasswords-newpassword": "<strong>$1</strong>-இற்கு புகுபதிகை செய்வதற்கான புதிய கடவுச்சொல் <strong>$2</strong> ஆகும். <em>தயவு செய்து வருங்கால மேற்கோளுக்கு இதனை பதிக.</em><br>(பழைய முகவர்கள்  பயனாளர் பெயரை உள்ளீட்டிற்கு பயன்படுத்தலாம், மேலும் நீங்கள் <strong>$3</strong> ஐ பயனாளர் பெயராகவும் <strong>$4</strong>  ஐ கடவுச்சொல்லாகவும் பயன்படுத்தலாம்.)",
        "botpasswords-no-provider": "தானியங்கிகடவுச்சொல்அமர்வுவழங்குநர் பயன்பாட்டில் இல்லை.",
        "botpasswords-restriction-failed": "தானியங்கி கடவுச்சொல் புகுபதிகை செய்ய தடுக்கிறது.",
        "botpasswords-invalid-name": "தானியங்கி கடவுச்சொல் பிரிப்பானை (\"$1\") குறிக்கப்பட்ட பயனர் பெயர் கொண்டிருக்கவில்லை.",
        "botpasswords-not-exist": "\"$1\" என்ற பயனர் \"$2\" என்ற தானியங்கி கடவுச்சொல்லை கொண்டிருக்கவில்லை.",
        "resetpass_forbidden": "கடவுச்சொற்கள் மாற்றப்பட முடியாது",
+       "resetpass_forbidden-reason": "கடவுச்சொற்கள் மாற்றப்பட முடியாது:$1",
        "resetpass-no-info": "இப்பக்கத்தை நேரடியாக அணுகுவதற்கு நீங்கள் புகுபதிகை செய்திருக்கவேண்டும்.",
        "resetpass-submit-loggedin": "கடவுச்சொல்லை மாற்று",
        "resetpass-submit-cancel": "விட்டுவிடு",
        "passwordreset-emailelement": "பயனர் பெயர்:  \n$1\n\nதற்காலிகக் கடவுச்சொல்: \n$2",
        "passwordreset-emailsentemail": "இது உங்கள் கணக்கிற்கான பதிவு செய்யப்பட்ட மின்னஞ்சலாயின், கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல் அனுப்பப்படும்",
        "passwordreset-emailsentusername": "இது உங்கள் கணக்கிற்கான பதிவு செய்யப்பட்ட மின்னஞ்சலாயின், கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல் அனுப்பப்படும்",
+       "passwordreset-invalidemail": "செல்லுபடியற்ற அஞ்சல் முகவரி",
+       "passwordreset-nodata": "பயனர் பெயர் மற்றும் மின்னஞ்சல் முகவரி கொடுக்கப்படவில்லை",
        "changeemail": "மின்னஞ்சல் முகவரியை மாற்று / நீக்கு",
        "changeemail-header": "இந்த படிவத்தை உங்கள் மின்னஞ்சல் முகவரியை மாற்ற பூர்த்தி செய்யவும். நீங்கள் இந்த மாற்றத்தை உறுதிசெய்ய உங்கள் கடவுச்சொல்லை உள்ளிட வேண்டிவரும்.  உங்கள் கணக்கிலிருந்து ஏதாவது மின்னஞ்சலை நீக்க விரும்பினால், படிவத்தை சமர்ப்பிக்கும்போது மின்னஞ்சல் முகவரியை காலியாக விடவும்.",
        "changeemail-no-info": "இப்பக்கத்தை நேரடியாக அணுகுவதற்கு நீங்கள் புகுபதிகை செய்திருக்கவேண்டும்.",
        "content-model-css": "சிஎஸ்எஸ்",
        "content-json-empty-object": "காலி பொருள்",
        "content-json-empty-array": "காலி அணி",
+       "deprecated-self-close-category": "தவறாக சுய மூடப்பட்ட HTML குறிச்சொற்களை பயன்படுத்தும் பக்கங்கள்",
        "duplicate-args-category": "வார்ப்புரு அழைப்பில் ஒத்த விவாதங்களை கொண்ட பக்கங்கள்",
        "duplicate-args-category-desc": "இப்பக்கம் விவாதங்களின் ஒத்த வடிவங்களைப் பயன்படுத்தும் வார்ப்புருக்களை, எடுத்துக்காட்டக <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code> கொண்டுள்ளது.",
        "expensive-parserfunction-warning": "எச்சரிக்கை: இப்பக்கம் அதிகளவு இலக்கணப் பாகுபடுத்திச் சார்புகளைக் கொண்டுள்ளது.\n\nஇது $2 {{PLURAL:$2|சார்புக்கும்|சார்புகளுக்கும் }} குறைவான இலக்கணப் பாகுபடுத்திச் சார்புகளைக் கொண்டிருக்க வேண்டும், ஆனால் தற்போது இதில் {{PLURAL:$1|$1 சார்பு|$1 சார்புகள்}} உள்ளன.",
        "mergehistory-empty": "இணைக்கப்படக்கூடிய திருத்தங்கள் எதுவுமில்லை.",
        "mergehistory-done": "$1 பக்கத்தின் {{PLURAL:$3|ஒரு திருத்தம்|$3 திருத்தங்கள்}} வெற்றிகரமாக [[:$2]] பக்கத்தில் இணைக்கப்பட்ட{{PLURAL:$3|து|ன}}.",
        "mergehistory-fail": "வரலாற்றை இணைக்க முடியவில்லை. அருள் கூர்ந்து நேரங்களை ஒரு முறை சரி பார்க்கவும்.",
+       "mergehistory-fail-bad-timestamp": "செல்லுப்படியாகாத நேர முத்திரை.",
        "mergehistory-fail-invalid-source": "மூலப்பக்கம் பயன்பாட்டில் இல்லை.",
        "mergehistory-fail-invalid-dest": "இலக்குப் பக்கம் செல்லுபடியற்றது.",
+       "mergehistory-fail-permission": "வரலாறுகளை ஒன்றினைக்க தேவையாக அதிகாரங்கள் இல்லை.",
        "mergehistory-fail-toobig": "$1 அளவுக்கு மேல் வரலாறு இணைப்பு செய்ய இயலவில்லை {{PLURAL:$1|revision|திருத்தங்கள்}} நகர்த்தப்படும்.",
        "mergehistory-no-source": "மூலப் பக்கம் $1 இல்லை.",
        "mergehistory-no-destination": "இலக்குப் பக்கம் $1 இல்லை.",
        "search-interwiki-caption": "உறவுத் திட்டங்கள்",
        "search-interwiki-default": "$1 தளத்திலிருந்து முடிவுகள்:",
        "search-interwiki-more": "(மேலும்)",
+       "search-interwiki-more-results": "மேலும் முடிவுகள்",
        "search-relatedarticle": "தொடர்புடையவை",
        "searchrelated": "தொடர்புடையவை",
        "searchall": "அனைத்தும்",
        "saveprefs": "சேமி",
        "restoreprefs": "எல்லோருக்கும் பொதுவான வடிவமைப்பைத் திரும்பக்கொண்டுவரவும் (எல்லா பிரிவுகளிலும்).",
        "prefs-editing": "தொகுத்தல்",
-       "rows": "நிரைகள் (கிடை வரிசைகள்):",
-       "columns": "நிரல்கள்",
        "searchresultshead": "தேடுக",
        "stub-threshold": "<a href=\"#\" class=\"stub\">stub link</a> சீர்படுத்தலுக்கான எல்லை (பைட்டுகள்):",
        "stub-threshold-sample-link": "மாதிரி",
        "action-userrights-interwiki": "ஏனைய விக்கித் தளங்களின் பயனர் உரிமைகளைத் தொகு",
        "action-siteadmin": "தரவுதளத்தை பூட்டு அல்லது  பூட்டாதே",
        "action-sendemail": "மின்னஞ்சல்கள் அனுப்பு",
+       "action-editmyoptions": "உங்கள் விருப்பத்தேர்வுகளை தொகு",
        "action-editmywatchlist": "உங்கள் கவனிப்பு பட்டியலை தொகு",
        "action-viewmywatchlist": "உங்கள் கவனிப்பு பட்டியலை பார்",
        "action-viewmyprivateinfo": "உங்கள் தனிப்பட்ட தகவல்களைப் பார்",
        "action-managechangetags": "தரவுதளத்திலிருந்து அடையாளங்களை உருவாக்கு அல்லது நீக்கு",
        "action-applychangetags": "உங்கள் மாற்றங்களுடன் அடையாளங்களைச் செயற்படுத்து",
        "action-changetags": "தனியொருவரின் திருத்தம் மற்றும் செயற்பாட்டு பதிவுகளில் அடையாளங்களைச் சேர் அல்லது நீக்கு",
+       "action-purge": "இப்பக்கத்தினை துப்புரவாக்கு",
        "nchanges": "{{PLURAL:$1|ஓர் மாற்றம்|$1 மாற்றங்கள்}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|கடந்த வருகையிலிருந்து}}",
        "enhancedrc-history": "வரலாறு",
        "recentchanges-legend-heading": "<strong>குறியீட்டு விளக்கம்:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|புதிய பக்கங்கள் பட்டியலையும்]] காணவும்)",
        "recentchanges-submit": "காட்டு",
+       "rcfilters-filterlist-title": "வடிப்பான்கள்",
+       "rcfilters-highlightmenu-title": "ஒரு நிறத்தை தேர்ந்தெடுக்கவும்",
+       "rcfilters-filterlist-noresults": "எந்த வடிப்பானும் காணப்படவில்லை",
+       "rcfilters-filtergroup-registration": "பயனர் பதிகை",
+       "rcfilters-filter-registered-label": "பதிவுசெய்யப்பட்டது",
+       "rcfilters-filter-unregistered-label": "பதிவு நீக்கம் செய்யப்பட்டது",
+       "rcfilters-filter-editsbyself-label": "தங்களின் சொந்த தொகுப்புகள்",
+       "rcfilters-filter-editsbyself-description": "தங்களது தொகுப்புகள்.",
+       "rcfilters-filter-editsbyother-label": "மற்றவர் தொகுப்புகள்",
+       "rcfilters-filter-userExpLevel-newcomer-label": "புது வரவுகள்",
+       "rcfilters-filter-userExpLevel-learner-label": "கற்போர்",
+       "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-filtergroup-changetype": "மாற்ற வகை",
+       "rcfilters-filter-pageedits-label": "பக்க தொகுப்புகள்",
+       "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ஜாவா கோப்புகளை தகவலேற்றுவது தடைசெய்யப்பட்டுள்ளது.ஏனெனில் அது பாதுகாப்பு தடைகளை மீற வழிவகுக்கும்.",
        "apisandbox-request-url-label": "URL வேண்டுகோள்:",
        "apisandbox-request-time": "வேண்டுகோள் நேரம்: {{PLURAL:$1|$1 மிசெ}}",
        "apisandbox-results-fixtoken": "அட்டையை திருத்தி மீண்டும் சமர்பிக்கவும்",
+       "apisandbox-continue": "தொடரவும்",
+       "apisandbox-continue-clear": "வெறுமையாக்குக",
        "booksources": "நூல் மூலங்கள்",
        "booksources-search-legend": "நூல் மூலங்களைத் தேடு",
        "booksources-search": "தேடுக",
        "listgrouprights-namespaceprotection-header": "பெயர்வெளி கட்டுப்பாடு",
        "listgrouprights-namespaceprotection-namespace": "பெயர்வெளி",
        "listgrouprights-namespaceprotection-restrictedto": "பயனரை திருத்த அனுமதிக்கும் உரிமை(கள்)",
+       "listgrants-grant": "நல்கை",
        "listgrants-rights": "அணுக்கங்கள்",
        "trackingcategories": "பகுப்புகளை தடமறி",
        "trackingcategories-msg": "பகுப்புகளை தடமறிதல்",
        "changecontentmodel-title-label": "பக்கத் தலைப்பு",
        "changecontentmodel-model-label": "புது உள்ளடக்க மாதிரி",
        "changecontentmodel-reason-label": "காரணம்:",
+       "changecontentmodel-submit": "மாற்றுக",
        "changecontentmodel-success-title": "உள்ளடக்க மாதிரி மாற்றப்பட்டது",
        "changecontentmodel-success-text": "[[:$1]]-இன் உள்ளடக்க வகை மாற்றப்பட்டது",
        "log-name-contentmodel": "உள்ளடக்க மாதிரி மாற்றப் பதிகை",
        "ipb-unblock": "ஐ.பி. அல்லது பயனருக்கான தடையை நீக்கு",
        "ipb-blocklist": "தற்போதுள்ள தடுப்புகளைப் பார்",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}}க்கு பங்களிப்புகள்",
+       "ipb-blocklist-duration-left": "$1 வெளியேறினர்",
        "unblockip": "பயனர் தடையை நீக்கு",
        "unblockiptext": "முன்னர் தடுக்கப்பட்ட ஐ.பி. முகவரி அல்லது பயனர்பெயரின் எழுத்து அணுக்கத்தை மீழ்விப்பதற்கு கீழேயுள்ள படிவத்தை பயன்படுத்தவும்.",
        "ipusubmit": "இந்தத் தடையை நீக்கு",
        "lockdbsuccesstext": "தரவுத்தளம் பூட்டப் பட்டது.<br />பராமரிப்பு முடிவடைந்ததும் [[Special:UnlockDB|பூட்டை நீக்க]] மறவாதீர்.",
        "unlockdbsuccesstext": "தரவுத்தளம் திறக்கப்பட்டது.",
        "lockfilenotwritable": "தரவுதள பூட்டு கோப்பு எழுதுமாறு  இல்லை.\nஇத்தரவுதளத்தை பூட்ட அல்லது பூட்டியதை நீக்க , இது  வலை சேவகன் எழுதுவதற்க்கேற்றவாறு இருக்க வேண்டும்.",
+       "databaselocked": "தரவுத்தளம் ஏற்கனவே பூட்டப்பட்டுள்ளது.",
        "databasenotlocked": "தரவுத்தளம் பூட்டப்படவில்லை.",
        "lockedbyandtime": "(இதன்படி{{GENDER:$1|$1}} on $2 at $3)",
        "move-page": "$1 பக்கத்தை நகர்த்து",
        "export-download": "கோப்பாக சேமி",
        "export-templates": "வார்ப்புருக்களையும் உள்ளடக்கு",
        "export-pagelinks": "இணைத்த பக்கங்களை கீழ்வரும்  ஆழம் வரை சேர்:",
+       "export-manual": "கைமுறையாக பக்கங்களை சேர்க:",
        "allmessages": "அனைத்து முறைமைசார் தகவல்கள் அட்டவணை",
        "allmessagesname": "பெயர்",
        "allmessagesdefault": "இயல்பிருப்பு உரை",
        "tooltip-ca-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": "இப்பெயரைக் கொண்டப் பக்கம் இருப்பின் அதற்கு நேரடியாகச் செல்க",
        "tooltip-ca-nstab-category": "பகுப்புப் பக்கத்தை பார்க்க",
        "tooltip-minoredit": "இம்மாற்றத்தை சிறிய தொகுப்பாக கருது",
        "tooltip-save": "உங்கள் மாற்றங்களைச் சேமிக்கவும்.",
+       "tooltip-publish": "மாற்றங்களைப் பதிப்பிடுக",
        "tooltip-preview": "நீங்கள் செய்த மாற்றங்களின் முன்தோற்றம் பார்க்கவும்! தயவுசெய்து, மாற்றங்களை சேமிக்கும் முன்னர் இதனைப் பயன்படுத்தவும்!",
        "tooltip-diff": "உரையில் நீங்கள் செய்த மாற்றங்களைக் காட்டவும்.",
        "tooltip-compareselectedversions": "இப் பக்கத்தின் தெரிவு செய்யப்பட்ட இரண்டு பதிப்புக்களுக்கு இடையிலான வேறுபாடுகளைப் பார்க்கவும்.",
        "pageinfo-category-pages": "பக்கங்களின் எண்ணிக்கை",
        "pageinfo-category-subcats": "துணைபகுப்புகளின் எண்ணிக்கை",
        "pageinfo-category-files": "கோப்புகளின் எண்ணிக்கை",
+       "pageinfo-user-id": "பயனர் அடையாளம்",
        "markaspatrolleddiff": "ரோந்திட்டதாக குறி",
        "markaspatrolledtext": "இதனை சுற்றுக்காவல் செய்ததாகக் குறி",
        "markaspatrolledtext-file": "இக்கோப்பு பதிப்பினை ரோந்திட்டதாக குறி",
        "patrol-log-header": "இது ரோந்து செய்யப்பட்ட  பரிசீலனைகளுக்கான  குறிப்பேடு.",
        "log-show-hide-patrol": "$1 ரோந்து குறிப்பேடு",
        "log-show-hide-tag": "$1 அடையாள பதிவு",
+       "confirm-markpatrolled-button": "சரி",
        "deletedrevision": "பழைய திருத்தம் $1 நீக்கப்பட்டது",
        "filedeleteerror-short": "பின்வரும் கோப்பை நீக்குவதில் தவறு: $1",
        "filedeleteerror-long": "கோப்பை நீக்கும் போது தவறுகள் ஏற்பட்டுள்ளன:\n\n$1",
        "newimages-showbots": "தானியிங்கி பதிவேற்றங்களைக் காட்டு",
        "newimages-hidepatrolled": "ரோந்திட்ட பதிவேற்றங்களை மறை",
        "noimages": "பார்வைக்கு ஓன்றுமில்லை.",
+       "gallery-slideshow-toggle": "வில்லைப்படங்களை ஊசலாடு",
        "ilsubmit": "தேடுக",
        "bydate": "நாள் வழி",
        "sp-newimages-showfrom": "$1, $2க்குப் பின்னரான புதியக் கோப்புக்களைக் காட்டுக",
        "confirm-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": "இப்பக்கத்தை உங்கள்  கவனிப்புப் பட்டியலிருந்து நீக்கா வேண்டுமா?",
+       "confirm-rollback-button": "சரி",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← முந்திய பக்கம்",
        "imgmultipagenext": "அடுத்தப் பக்கம் →",
        "htmlform-cloner-create": "மேலும் சேர்க",
        "htmlform-cloner-delete": "நீக்குக",
        "htmlform-cloner-required": "குறைந்து ஒரு மதிப்பு தேவைப்படும்.",
+       "htmlform-date-placeholder": "வவவவ-மாமா-தேதே",
+       "htmlform-time-placeholder": "மம:நிநி:நொநொ",
+       "htmlform-datetime-placeholder": "வவவவ-மாமா-தேதே மம:நிநி:நொநொ",
        "htmlform-title-badnamespace": "\"{{ns:$2}}\" பெயர்வெளியில் [[:$1]] இல்லை",
        "htmlform-title-not-creatable": "\"$1\" ஒரு உருவாக்கத்தக்க பக்கத் தலைப்பு அல்ல",
        "htmlform-title-not-exists": "$1 இ்டம்பெறவில்லை.",
        "logentry-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": "சமர்ப்பி",
+       "pagelang-nonexistent-page": "பக்கம் $1 காணப்படவில்லை.",
        "right-pagelang": "பக்க மொழியை மாற்றுக",
        "action-pagelang": "பக்க மொழியை மாற்றுக",
        "log-name-pagelang": "மொழி பதிவை மாற்றுக",
        "log-description-pagelang": "இது பக்க மொழி மாற்றச் செயல்பாட்டின் பதிவு.",
        "logentry-pagelang-pagelang": "$3 க்கான பக்க மொழியை $4 இலிருந்து $5 க்கு $1 {{GENDER:$2|மாற்றினார்}}.",
+       "mediastatistics": "ஊடகம் பற்றிய புள்ளிவிவரங்கள்",
        "mediastatistics-bytespertype": "இந்த பிரிவக்கான மொத்த கோப்பளவு: $1 எண்ணுண்மி",
        "mediastatistics-allbytes": "அனைத்து கோப்புகளின் மொத்த கோப்பளவு: $1 எண்ணுண்மி",
        "mediastatistics-table-count": "கோப்புகளின் எண்ணிக்கை",
        "mediastatistics-header-video": "காணொளிகள்",
        "mediastatistics-header-office": "அலுவலகம்",
        "mediastatistics-header-text": "உரை வடிவ",
+       "mediastatistics-header-archive": "அமுக்கிய வடிவங்கள்",
        "mediastatistics-header-total": "அனைத்துக் கோப்புக்களும்",
        "json-error-syntax": "தொடரியல் பிழை",
        "special-characters-group-latin": "இலத்தீன்",
        "special-characters-group-ipa": "பன்னாட்டு ஒலிப்பு அரிச்சுவடி",
        "special-characters-group-symbols": "குறியீடுகள்",
        "special-characters-group-greek": "கிரேக்கம்",
+       "special-characters-group-greekextended": "நீடித்த கிரேக்கம்",
        "special-characters-group-cyrillic": "சைரிலிக் (Cyrillic)",
        "special-characters-group-arabic": "அரபு",
        "special-characters-group-arabicextended": "அரபு விரிவு",
        "special-characters-title-emdash": "பெரு கோடு",
        "special-characters-title-minus": "கழித்தல் குறி",
        "mw-widgets-dateinput-no-date": "திகதி தெரிவுச் செய்யப்படவில்லை",
+       "mw-widgets-mediasearch-noresults": "முடிவுகள் எதுவும் காணப்படவில்லை.",
        "mw-widgets-titleinput-description-new-page": "இப்பக்கம் இன்னும் உருவாக்கப்படவில்லை",
        "mw-widgets-titleinput-description-redirect": "$1-க்கு வழிமாற்று",
+       "mw-widgets-categoryselector-add-category-placeholder": "ஒரு பகுப்பைச் சேர்க...",
+       "mw-widgets-usersmultiselect-placeholder": "மேலும் சேர்க...",
        "sessionprovider-generic": "$1 பகுதி",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "குக்கீயை அடிபடையாக்கக் கொண்ட பகுதிகள்",
        "sessionprovider-nocookies": "குக்கீசு செயலற்று இருக்கலாம். உங்களது குக்கீசு செயலில் உள்ளது என உறுதிப்படுத்திவிட்டு மீண்டும் முயல்க.",
index 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 78e42c4..3776c86 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": "మార్చు",
        "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.}}",
        "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": "నమూనా",
        "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ఈ సమాచారం బహిరంగం.",
        "userrights-user-editname": "వాడుకరిపేరును ఇవ్వండి:",
        "editusergroup": "వాడుకరి గుంపులను చూపించు",
        "editinguser": "{{GENDER:$1|user}} వాడుకరి హక్కులను మారుస్తున్నారు <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "వాడుకరి సమూహాలను మార్చండి",
+       "userrights-editusergroup": "{{GENDER:$1|వాడుకరి}} సమూహాలను మార్చండి",
+       "userrights-viewusergroup": "{{GENDER:$1|వాడుకరి}} గుంపులను చూడండి",
        "saveusergroups": "{{GENDER:$1|వాడుకరి}} గుంపులను భద్రపరచు",
        "userrights-groupsmember": "సభ్యులు:",
        "userrights-groupsmember-auto": "సంభావిత సభ్యులు:",
-       "userrights-groups-help": "ఈ వాడుకరి ఏయే గుంపులలో ఉండాలో మీరు మార్చవచ్చు.\n* టిక్కు పెట్టివుంటే ఆ గుంపులో ఈ వాడుకరి ఉన్నట్టు.\n* టిక్కు లేకుంటే ఆ గుంపులో ఈ వాడుకరి లేనట్టు.\n* * ఉంటే ఒకసారి ఆ గుంపుని చేర్చాక మీరు తీసివేయలేరు, లేదా తీసివేసాక తిరిగి చేర్చలేరు.",
+       "userrights-groups-help": "ఈ వాడుకరి ఏయే గుంపులలో ఉండాలో మీరు మార్చవచ్చు.\n* టిక్కు పెట్టివుంటే ఆ గుంపులో ఈ వాడుకరి ఉన్నట్టు.\n* టిక్కు లేకుంటే ఆ గుంపులో ఈ వాడుకరి లేనట్టు.\n* ఈ * గుర్తు ఉంటే ఒకసారి ఆ గుంపుని చేర్చాక మీరు తీసివేయలేరు, లేదా తీసివేసాక తిరిగి చేర్చలేరు.\n* ఈ # గుర్తు ఉంటే ఆ గుంపు కాలం తీరిపోయే సమయాన్ని పెంచగలరు; దాన్ని తగ్గించలేరు.",
        "userrights-reason": "కారణం:",
        "userrights-no-interwiki": "ఇతర వికీలలో వాడుకరి హక్కులను మార్చడానికి మీకు అనుమతి లేదు.",
        "userrights-nodatabase": "$1 అనే డేటాబేసు లేదు లేదా అది స్థానికం కాదు.",
        "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": "వాడుకరి హక్కుల మార్పులలో ఘర్షణ! మీ మార్పులను సమీక్షించి, నిర్ధారించండి.",
        "group": "గుంపు:",
        "group-user": "వాడుకరులు",
        "action-upload_by_url": "ఈ ఫైలుని URL చిరునామా నుండి ఎగుమతి చేసే",
        "action-writeapi": "వ్రాసే APIని ఉపయోగించే",
        "action-delete": "ఈ పేజీని తొలగించే",
-       "action-deleterevision": "à°\88 à°\95à±\82à°°à±\8dà°ªà±\81ని తొలగించే",
+       "action-deleterevision": "à°\95à±\82à°°à±\8dà°ªà±\81లనà±\81 తొలగించే",
        "action-deletelogentry": "చిట్టా పద్దులను తొలగించే",
        "action-deletedhistory": "పేజీల తొలగించిన చరిత్రని చూసే",
        "action-deletedtext": "తొలగించిన కూర్పుల పాఠ్యాన్ని చూసే",
        "action-browsearchive": "తొలగించిన పేజీలలో వెతికే",
        "action-undelete": "పేజీలను పునఃస్థాపించే",
-       "action-suppressrevision": "à°\88 à°¦à°¾à°\9aà°¿à°¨ à°\95à±\82à°°à±\8dà°ªà±\81ని à°¸à°®à±\80à°\95à±\8dà°·à°¿à°\82à°\9aà°¿ పునఃస్థాపించే",
+       "action-suppressrevision": "దాà°\9aà°¿à°¨ à°\95à±\82à°°à±\8dà°ªà±\81లనà±\81 à°¸à°®à±\80à°\95à±\8dà°·à°¿à°\82à°\9aà°¿, పునఃస్థాపించే",
        "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-highlightmenu-title": "ఒక రంగును ఎంచుకోండి",
+       "rcfilters-filtergroup-registration": "వాడుకరి నమోదు",
+       "rcfilters-filter-editsbyself-label": "మీ స్వంత దిద్దుబాట్లు",
+       "rcfilters-filter-editsbyself-description": "మీ దిద్దుబాట్లు.",
+       "rcfilters-filter-editsbyother-label": "ఇతరుల దిద్దుబాట్లు",
+       "rcfilters-filter-editsbyother-description": "ఇతరులు (మీరు కాదు) చేసిన దిద్దుబాట్లు.",
+       "rcfilters-filtergroup-userExpLevel": "అనుభవ స్థాయి (నమోదైన వాడుకరులకు మాత్రమే)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "కొత్తవారు",
+       "rcfilters-filter-userExpLevel-newcomer-description": "10 కంటే తక్కువ దిద్దుబాట్లు, 4 రోజుల కంటే తక్కువ పని.",
+       "rcfilters-filter-userExpLevel-learner-label": "నేర్చుకుంటున్నవారు",
+       "rcfilters-filter-userExpLevel-learner-description": "\"కొత్తవారి\" కంటే ఎక్కువ, \"అనుభవజ్ఞులైన వాడుకరుల\" కంటే తక్కువ పనిరోజులు.",
+       "rcfilters-filter-userExpLevel-experienced-label": "అనుభవజ్ఞులైన వాడుకరులు",
+       "rcfilters-filter-userExpLevel-experienced-description": "30 రోజుల కంటే ఎక్కువ పని, 500 పైచిలుకు దిద్దుబాట్లు.",
+       "rcfilters-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 ఫైళ్ళ వలన భద్రతకు తూట్లు పడే అవకాశం ఉంది కాబట్టి, వాటిని ఎక్కించడానికి అనుమతి లేదు.",
        "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 (అన్ని పేరుబరులు)",
        "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తొలగించిన కూర్పులలోని వాస్తవ పాఠ్యం నిర్వాహకులకు మాత్రమే అందుబాటులో ఉంటుంది.",
        "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": "కారణం:",
        "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": "అనుమతించబడలేదు",
        "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-removed": "{{PLURAL:$1|1 శీర్షికను|$1 శీర్షికలను}} తీసివేశాం:",
        "watchlistedit-clear-title": "వీక్షణజాబితా చెరిపివేయి",
        "watchlistedit-clear-legend": "వీక్షణజాబితా చెరిపివేయి",
+       "watchlistedit-clear-explain": "ఈ శీర్షికలన్నిటినీ మీ వీక్షణ జాబితా నుండి తీసేస్తాం",
        "watchlistedit-clear-titles": "శీర్షికలు:",
        "watchlistedit-clear-submit": "వీక్షణ జాబితా శుభ్రం చేయి (ఇది శాశ్వతం!)",
        "watchlistedit-clear-done": "మీ వీక్షణ జాబితాను శుభ్రం చేశాం.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 శీర్షికను|$1 శీర్షికలను}} తీసివేశాం:",
+       "watchlistedit-too-many": "ఇక్కడ చూపించలేనన్ని పేజీలున్నాయి.",
        "watchlisttools-clear": "వీక్షణజాబితాను శుభ్రం చేయి",
        "watchlisttools-view": "సంబంధిత మార్పులను చూడండి",
        "watchlisttools-edit": "వీక్షణ జాబితాను చూడండి లేదా మార్చండి",
        "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": "పేజీ పనిముట్లు",
        "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-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|గంట|గంటలు}}",
        "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": "భాష మార్పుల చిట్టా",
        "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 ad5535e..e688c30 100644 (file)
@@ -50,9 +50,9 @@
        "tog-minordefault": "กำหนดการแก้ไขทุกครั้งเป็นการแก้ไขเล็กน้อยโดยปริยาย",
        "tog-previewontop": "แสดงตัวอย่างก่อนกล่องแก้ไข",
        "tog-previewonfirst": "แสดงตัวอย่างในการแก้ไขครั้งแรก",
-       "tog-enotifwatchlistpages": "อีà¹\80มลหาเมื่อหน้าหรือไฟล์ในรายการเฝ้าดูเปลี่ยนแปลง",
-       "tog-enotifusertalkpages": "อีà¹\80มลหาเมื่อมีการเปลี่ยนแปลงหน้าคุยกับผู้ใช้ของฉัน",
-       "tog-enotifminoredits": "อีà¹\80มลหาเช่นกันสำหรับการแก้ไขหน้าและไฟล์เล็กน้อย",
+       "tog-enotifwatchlistpages": "อีà¹\80มลà¸\9aอà¸\81à¸\89ัà¸\99เมื่อหน้าหรือไฟล์ในรายการเฝ้าดูเปลี่ยนแปลง",
+       "tog-enotifusertalkpages": "อีà¹\80มลà¸\9aอà¸\81à¸\89ัà¸\99เมื่อมีการเปลี่ยนแปลงหน้าคุยกับผู้ใช้ของฉัน",
+       "tog-enotifminoredits": "อีà¹\80มลà¸\9aอà¸\81à¸\89ัà¸\99เช่นกันสำหรับการแก้ไขหน้าและไฟล์เล็กน้อย",
        "tog-enotifrevealaddr": "เปิดเผยที่อยู่อีเมลของฉันในอีเมลแจ้งเตือน",
        "tog-shownumberswatching": "แสดงจำนวนผู้ใช้ที่เฝ้าดู",
        "tog-oldsig": "ลายเซ็นที่คุณมีอยู่:",
@@ -75,9 +75,9 @@
        "tog-prefershttps": "ใช้การเชื่อมต่อปลอดภัยทุกครั้งเมื่อเข้าสู่ระบบแล้ว",
        "underline-always": "ทุกครั้ง",
        "underline-never": "ไม่",
-       "underline-default": "à¸\84à¹\88าà¹\82à¸\94ยà¸\9bริยายของหน้าตาหรือเบราว์เซอร์",
+       "underline-default": "à¸\84à¹\88าà¹\80ริà¹\88มà¸\95à¹\89à¸\99ของหน้าตาหรือเบราว์เซอร์",
        "editfont-style": "รูปแบบชุดแบบอักษรในพื้นที่แก้ไข:",
-       "editfont-default": "à¸\84à¹\88าà¹\82à¸\94ยà¸\9bริยายของเบราว์เซอร์",
+       "editfont-default": "à¸\84à¹\88าà¹\80ริà¹\88มà¸\95à¹\89à¸\99ของเบราว์เซอร์",
        "editfont-monospace": "ชุดอักษรแบบความกว้างคงที่",
        "editfont-sansserif": "ชุดอักษรแบบไม่มีเชิง",
        "editfont-serif": "ชุดอักษรแบบมีเชิง",
        "qbedit": "แก้ไข",
        "qbpageoptions": "หน้านี้",
        "qbmyoptions": "หน้าของฉัน",
-       "faq": "คำถามพบบ่อย",
-       "faqpage": "Project:คำถามพบบ่อย",
+       "faq": "à¸\84ำà¸\96ามà¸\97ีà¹\88à¸\9eà¸\9aà¸\9aà¹\88อย",
+       "faqpage": "Project:à¸\84ำà¸\96ามà¸\97ีà¹\88à¸\9eà¸\9aà¸\9aà¹\88อย",
        "actions": "ปฏิบัติการ",
        "namespaces": "เนมสเปซ",
        "variants": "สิ่งที่แตกต่าง",
        "searcharticle": "ไป",
        "history": "ประวัติหน้า",
        "history_short": "ประวัติ",
+       "history_small": "ประวัติ",
        "updatedmarker": "ถูกปรับตั้งแต่การเยี่ยมชมครั้งสุดท้ายของฉัน",
        "printableversion": "รุ่นพร้อมพิมพ์",
        "permalink": "ลิงก์ถาวร",
        "imagepage": "ดูหน้าไฟล์",
        "mediawikipage": "ดูหน้าข้อความ",
        "templatepage": "ดูหน้าแม่แบบ",
-       "viewhelppage": "à¸\94ูหà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aาย",
+       "viewhelppage": "à¸\94ูหà¸\99à¹\89าวิà¸\98ีà¹\83à¸\8aà¹\89",
        "categorypage": "ดูหน้าหมวดหมู่",
        "viewtalkpage": "ดูการพูดคุย",
        "otherlanguages": "ในภาษาอื่น",
        "redirectto": "เปลี่ยนทางไป:",
        "lastmodifiedat": "ดัดแปรหน้านี้ล่าสุดเมื่อวันที่ $1 เวลา $2",
        "viewcount": "มีการเข้าถึงหน้านี้ $1 ครั้ง",
-       "protectedpage": "หà¸\99à¹\89าà¸\96ูà¸\81ลà¹\87อà¸\81",
+       "protectedpage": "หà¸\99à¹\89าà¸\96ูà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99",
        "jumpto": "ข้ามไป:",
        "jumptonavigation": "การนำทาง",
        "jumptosearch": "ค้นหา",
        "databaseerror-query": "คำสั่ง: $1",
        "databaseerror-function": "ฟังก์ชัน: $1",
        "databaseerror-error": "ข้อผิดพลาด: $1",
-       "laggedslavemode": "<strong>คำเตือน:</strong> หน้านี้อาจไม่มีการปรับล่าสุด",
+       "laggedslavemode": "<strong>à¸\84ำà¹\80à¸\95ือà¸\99:</strong> à¸«à¸\99à¹\89าà¸\99ีà¹\89อาà¸\88à¹\84มà¹\88มีà¸\81ารà¸\9bรัà¸\9aà¸\82à¹\89อมูลลà¹\88าสุà¸\94",
        "readonly": "ฐานข้อมูลถูกล็อก",
        "enterlockreason": "ใส่เหตุแห่งการล็อก ทั้งเวลาที่คาดว่าจะปลดล็อก",
        "readonlytext": "ขณะนี้ฐานข้อมูลถูกล็อกรายการใหม่และการแก้ไขเพิ่มเติมอื่น อาจเป็นเพราะการบำรุงรักษาฐานข้อมูลรูทีน หลังแล้วเสร็จจะกลับมาใช้งานได้ตามปกติ\n\nผู้ดูแลระบบที่ล็อกได้ให้คำอธิบายดังนี้: $1",
        "namespaceprotected": "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ <strong>$1</strong>",
        "customcssprotected": "คุณไม่มีสิทธิแก้ไขหน้า CSS นี้ เพราะมีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
        "customjsprotected": "คุณไม่มีสิทธิแก้ไขหน้าจาวาสคริปต์นี้ เพราะหน้านี้มีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
-       "mycustomcssprotected": "คุณไม่มีสิทธิแก้ไขหน้าซีเอสเอสนี้",
+       "mycustomcssprotected": "คุณไม่มีสิทธิแก้ไขหน้า CSS นี้",
        "mycustomjsprotected": "คุณไม่มีสิทธิแก้ไขหน้าจาวาสคริปต์นี้",
        "myprivateinfoprotected": "คุณไม่มีสิทธิแก้ไขข้อมูลส่วนตัวของคุณ",
        "mypreferencesprotected": "คุณไม่มีสิทธิแก้ไขการตั้งค่าของคุณ",
        "password-change-forbidden": "คุณไม่สามารถเปลี่ยนรหัสผ่านบนวิกินี้",
        "externaldberror": "มีข้อผิดพลาดของฐานข้อมูลการพิสูจน์ตัวจริง หรือคุณไม่ได้รับอนุญาตให้ปรับบัญชีภายนอกของคุณ",
        "login": "ล็อกอิน",
+       "login-security": "ยืนยันตัวตนของคุณ",
        "nav-login-createaccount": "ล็อกอิน / สร้างบัญชี",
        "userlogin": "ล็อกอิน / สร้างบัญชี",
        "userloginnocreate": "ล็อกอิน",
        "userlogin-resetpassword-link": "ลืมรหัสผ่านหรือ",
        "userlogin-helplink2": "วิธีใช้เรื่องการล็อกอิน",
        "userlogin-loggedin": "คุณล็อกอินในชื่อ {{GENDER:$1|$1}} แล้ว\nใช้แบบด้านล่างเพื่อล็อกอินเป็นอีกผู้ใช้หนึ่ง",
+       "userlogin-reauth": "คุณต้องเข้าสู่ระบบอีกครั้งเพื่อยืนยันว่าคุณคือ{{GENDER:$1|$1}}",
        "userlogin-createanother": "สร้างอีกบัญชี",
        "createacct-emailrequired": "ที่อยู่อีเมล",
        "createacct-emailoptional": "ที่อยู่อีเมล (เลือกไม่ใส่ก็ได้)",
        "createacct-email-ph": "กรอกที่อยู่อีเมลของคุณ",
        "createacct-another-email-ph": "กรอกที่อยู่อีเมล",
        "createaccountmail": "ใช้รหัสผ่านสุ่มชั่วคราวและส่งไปยังที่อยู่อีเมลที่ระบุ",
+       "createaccountmail-help": "สามารถใช้สร้างบัญชีสำหรับบุคคลอื่นๆ โดยที่ไม่ต้องเรียนรู้รหัสผ่านก็ได้",
        "createacct-realname": "ชื่อจริง (เลือกไม่ใส่ได้)",
        "createaccountreason": "เหตุผล:",
        "createacct-reason": "เหตุผล",
        "createacct-reason-ph": "เหตุใดคุณจึงสร้างอีกบัญชี",
+       "createacct-reason-help": "ข้อความที่แสดงในล็อกการสร้างบัญชี",
        "createacct-submit": "สร้างบัญชีของคุณ",
        "createacct-another-submit": "สร้างบัญชี",
+       "createacct-continue-submit": "ทำการสร้างบัญชีต่อไป",
+       "createacct-another-continue-submit": "ทำการสร้างบัญชีต่อไป",
        "createacct-benefit-heading": "{{SITENAME}}สร้างจากคนเช่นคุณ",
        "createacct-benefit-body1": "$1 การแก้ไข",
        "createacct-benefit-body2": "$1 หน้า",
        "nocookiesnew": "สร้างบัญชีผู้ใช้แล้ว แต่ยังไม่ได้ล็อกอิน \n{{SITENAME}} ใช้คุกกี้เพื่อล็อกอินผู้ใช้\nคุณปิดใช้งานคุกกี้\nโปรดเปิดใช้งาน แล้วล็อกอินพร้อมชื่อผู้ใช้และรหัสผ่านใหม่ของคุณ",
        "nocookieslogin": "{{SITENAME}} ใช้คุกกี้เพื่อล็อกอินผู้ใช้\nคุณปิดใช้งานคุกกี้\nกรุณาเปิดใช้งานและลองอีกครั้ง",
        "nocookiesfornew": "บัญชีผู้ใช้ไม่ถูกสร้าง เนื่องจากเราไม่สามารถยืนยันต้นทาง\nกรุณาทำให้แน่ใจว่าคุณได้เปิดใช้งานคุกกี้ โหลดหน้านี้ใหม่และลองอีกครั้ง",
+       "createacct-loginerror": "บัญชีผู้ใช้ถูกสร้างสำเร็จแล้ว แต่คุณไม่สามารถเข้าสู่ระบบได้โดยอัตโนมัติ โปรด[[Special:UserLogin|เข้าสู่ระบบด้วยตนเอง]]",
        "noname": "คุณไม่ได้ใส่ชื่อผู้ใช้ที่ถูกต้อง",
        "loginsuccesstitle": "ล็อกอินสำเร็จ",
        "loginsuccess": "<strong>ขณะนี้คุณล็อกอินสู่ {{SITENAME}} ในชื่อ \"$1\"</strong>",
        "createacct-another-realname-tip": "ไม่จำเป็นต้องใส่ชื่อจริง\nหากคุณเลือกใส่ชื่อจริง จะใช้เพื่อแสดงที่มาสำหรับงานของตน",
        "pt-login": "ล็อกอิน",
        "pt-login-button": "ล็อกอิน",
+       "pt-login-continue-button": "ทำการเข้าสู่ระบบต่อไป",
        "pt-createaccount": "สร้างบัญชี",
        "pt-userlogout": "ล็อกเอาต์",
        "php-mail-error-unknown": "เกิดข้อผิดพลาดไม่ทราบสาเหตุในฟังก์ชัน mail() ของพีเอชพี",
        "changepassword-success": "เปลี่ยนรหัสผ่านของคุณสำเร็จ!",
        "changepassword-throttled": "ล่าสุดคุณพยายามล็อกอินมากครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง",
        "botpasswords": "รหัสผ่านบอต",
+       "botpasswords-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-emailelement": "ชื่อผู้ใช้: \n$1\n\nรหัสผ่านชั่วคราว: \n$2",
        "passwordreset-emailsentemail": "หากที่อยู่อีเมลนี้สัมพันธ์กับบัญชีของคุณ เช่นนั้นจะส่งอีเมลตั้งรหัสผ่านใหม่",
        "passwordreset-emailsentusername": "หากมีที่อยู่อีเมลที่ลงทะเบียนไว้ด้วยกับชื่อผู้ใช้นี้ เช่นนั้นจะส่งอีเมลตั้งรหัสผ่านใหม่",
+       "passwordreset-invalidemail": "ที่อยู่อีเมลไม่ถูกต้อง",
+       "passwordreset-nodata": "ไม่ได้ระบุชื่อผู้ใช้และรหัสผ่านไว้",
        "changeemail": "เปลี่ยนหรือลบที่อยู่อีเมล",
        "changeemail-header": "กรอกแบบนี้เพื่อเปลี่ยนที่อยู่อีเมลของคุณ หากคุณต้องการลบการเชื่อมโยงของที่อยู่อีเมลใด ๆ จากบัญชีของคุณ ให้เว้นที่อยู่อีเมลใหม่ว่างเมื่อส่งแบบ",
        "changeemail-no-info": "คุณจำต้องล็อกอินเพื่อเข้าถึงหน้านี้โดยตรง",
        "savearticle": "บันทึกหน้า",
        "savechanges": "บันทึกการเปลี่ยนแปลง",
        "publishpage": "เผยแพร่หน้า",
+       "publishchanges": "เผยแพร่การเปลี่ยนแปลง",
        "preview": "ตัวอย่าง",
        "showpreview": "แสดงตัวอย่าง",
        "showdiff": "แสดงการเปลี่ยนแปลง",
        "selfredirect": "<strong>คำเตือน:</strong> คุณกำลังสร้างการเปลี่ยนทางไปบทความเดียวกัน\nคุณอาจระบุเป้าหมายของการเปลี่ยนทางผิด หรือคถณอาจแก้ไขหน้าผิด \nหากคุณคลิก \"{{int:savearticle}}\" อีกครั้ง จะสร้างการเปลี่ยนทาง",
        "missingcommenttext": "กรุณากรอกความเห็นด้านล่าง",
        "missingcommentheader": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ใส่เรื่องสำหรับความเห็นนี้ \nถ้าคุณคลิก \"{{int:savearticle}}\" อีก จะบันทึกการแก้ไขของคุณโดยไม่ระบุเรื่อง",
-       "summary-preview": "ตัวอย่างคำอธิบาย:",
-       "subject-preview": "ตัวอย่างเรื่อง:",
+       "summary-preview": "ตัวอย่างคำอธิบายการแก้ไข:",
+       "subject-preview": "à¸\95ัวอยà¹\88าà¸\87à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87:",
        "previewerrortext": "เกิดข้อผิดพลาดขณะกำลังพยายามดูตัวอย่างการเปลี่ยนแปลงของคุณ",
        "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|การตั้งค่าผู้ใช้]]",
        "invalid-content-data": "ข้อมูลเนื้อหาไม่ถูกต้อง",
        "content-not-allowed-here": "ไม่อนุญาตเนื้อหา \"$1\" ในหน้า [[$2]]",
        "editwarning-warning": "การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณดำเนินการสูญหาย\nถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน \"{{int:prefs-editing}}\" ในการตั้งค่าของคุณ",
+       "editpage-invalidcontentmodel-title": "ไม่รองรับรูปแบบเนื้อหานี้",
        "editpage-notsupportedcontentformat-title": "รูปแบบเนื้อหาไม่ได้รับการรองรับ",
        "editpage-notsupportedcontentformat-text": "ตัวแบบเนื้อหา $2 ไม่รองรับตัวแบบเนื้อหา $1",
        "content-model-wikitext": "ข้อความวิกิ",
        "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": "ตัวอย่าง",
        "userrights-user-editname": "ใส่ชื่อผู้ใช้:",
        "editusergroup": "โหลดกลุ่มผู้ใช้",
        "editinguser": "กำลังเปลี่ยนสิทธิผู้ใช้ของผู้ใช้ <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "กำลังดูสิทธิผู้ใช้ของผู้ใช้ <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "แก้ไขกลุ่มผู้ใช้",
+       "userrights-viewusergroup": "ดูกลุ่ม{{GENDER:$1|ผู้ใช้}}",
        "saveusergroups": "บันทึกกลุ่ม{{GENDER:$1|ผู้ใช้}}",
        "userrights-groupsmember": "สมาชิกของ:",
        "userrights-groupsmember-auto": "สมาชิกโดยปริยายของ:",
        "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-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": "ปูมสิทธิผู้ใช้",
        "action-createpage": "สร้างหน้านี้",
        "action-createtalk": "สร้างหน้าอภิปรายนี้",
        "action-createaccount": "สร้างบัญชีผู้ใช้นี้",
+       "action-autocreateaccount": "สร้างบัญชีผู้ใช้ภายนอกนี้อัตโนมัติ",
        "action-history": "ดูประวัติหน้านี้",
        "action-minoredit": "ทำเครื่องหมายการแก้ไขนี้เป็นการแก้ไขเล็กน้อย",
        "action-move": "ย้ายหน้านี้",
        "action-writeapi": "ใช้การเขียนเอพีไอ",
        "action-delete": "ลบหน้านี้",
        "action-deleterevision": "ลบรุ่นปรับปรุง",
+       "action-deletelogentry": "ลบรายการบันทึก",
        "action-deletedhistory": "ดูประวัติที่ถูกลบของหน้าใดหน้าหนึ่ง",
+       "action-deletedtext": "ดูข้อความรุ่นแก้ไขเก่าที่ถูกลบ",
        "action-browsearchive": "ค้นหาหน้าที่ถูกลบ",
        "action-undelete": "กู้คืนหน้า",
        "action-suppressrevision": "ตรวจทานและกู้คืนรุ่นปรับปรุงที่ซ่อนอยู่",
        "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การแก้ไขเล็กน้อย",
        "uploaddisabledtext": "ปิดใช้งานการอัปโหลดไฟล์",
        "php-uploaddisabledtext": "ปิดการใช้งานการอัปโหลดไฟล์ในพีเอชพี\nกรุณาตรวจสอบการตั้งค่า file_uploads",
        "uploadscripted": "ไฟล์นี้มีโค้ดเอชทีเอ็มแอลหรือสคริปต์ ซึ่งอาจก่อให้การแปลคำสั่งของเบราว์เซอร์ผิดพลาด",
-       "uploadscriptednamespace": "ไฟล์ SVG นี้มีเนมสเปซไม่ถูกต้อง \"$1\"",
+       "uploadscriptednamespace": "ไฟล์ SVG นี้มีเนมสเปซไม่ถูกต้อง \"<nowiki>$1</nowiki>\"",
        "uploadvirus": "ไฟล์นี้มีไวรัส! \nรายละเอียด: $1",
        "upload-source": "ไฟล์ต้นทาง",
        "sourcefilename": "ชื่อไฟล์ต้นทาง:",
        "emailccsubject": "คัดลอกสารของคุณไป $1: $2",
        "emailsent": "ส่งอีเมลแล้ว",
        "emailsenttext": "ส่งสารอีเมลของคุณแล้ว",
-       "emailuserfooter": "$1 ส่งอีเมลนี้ถึง $2 โดยฟังก์ชัน \"{{int:emailuser}}\" ที่ {{SITENAME}}",
+       "emailuserfooter": "$1 ส่งอีเมลนี้ถึง $2 โดยฟังก์ชัน \"{{int:emailuser}}\" ที่ {{SITENAME}} อีเมลของคุณจะถูกส่งไปที่ผู้ส่งคนเดิมโดยตรง โดยจะเปิดเผยที่อยู่อีเมลให้พวกเขาเห็น",
        "usermessage-summary": "ฝากสารระบบ",
        "usermessage-editor": "ตัวส่งสารของระบบ",
        "watchlist": "รายการเฝ้าดู",
        "enotif_lastvisited": "ดู $1 สำหรับการเปลี่ยนแปลงทั้งหมดตั้งแต่คุณเยี่ยมชมครั้งสุดท้าย",
        "enotif_lastdiff": "ดู $1 เพื่อดูการเปลี่ยนแปลงนี้",
        "enotif_anon_editor": "ผู้ใช้นิรนาม $1",
-       "enotif_body": "เรียน $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nคำอธิบายอย่างย่อของผู้เขียน: $PAGESUMMARY $PAGEMINOREDIT\n\nติดต่อผู้เขียน:\nเมล: $PAGEEDITOR_EMAIL\nวิกิ: $PAGEEDITOR_WIKI\n\nจะไม่มีประกาศอื่นหากมีกิจกรรมเพิ่มเติม เว้นเสียแต่คุณจะเข้าชมหน้านี้ คุณยังสามารถตั้งค่าตัวบ่งชี้ประกาศใหม่สำหรับหน้าที่คุณเฝ้าดูทุกหน้าในรายการเฝ้าดูของคุณ\n\nระบบประกาศ {{SITENAME}} ที่เป็นมิตรของคุณ\n\n--\nในการเปลี่ยนการตั้งค่าประกาศอีเมลของคุณ โปรดดู\n{{canonicalurl:{{#special:Preferences}}}}\n\nในการเปลี่ยนการตั้งค่ารายการเฝ้าดูของคุณ โปรดดู\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nในการลบหน้าจากรายการเฝ้าดูของคุณ โปรดดู\n$UNWATCHURL\n\nผลป้อนกลับและความช่วยเหลือเพิ่มเติม:\n$HELPPAGE",
+       "enotif_body": "เรียน $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nคำอธิบายอย่างย่อของผู้เขียน: $PAGESUMMARY $PAGEMINOREDIT\n\nติดต่อผู้เขียน:\nเมล: $PAGEEDITOR_EMAIL\nวิกิ: $PAGEEDITOR_WIKI\n\nจะไม่มีประกาศอื่นหากมีกิจกรรมเพิ่มเติม เว้นเสียแต่คุณจะเข้าชมหน้านี้ขณะที่กำลังล็อกอินอยู่ คุณยังสามารถตั้งค่าตัวบ่งชี้ประกาศใหม่สำหรับหน้าที่คุณเฝ้าดูทุกหน้าในรายการเฝ้าดูของคุณ\n\nระบบประกาศ {{SITENAME}} ที่เป็นมิตรของคุณ\n\n--\nในการเปลี่ยนการตั้งค่าประกาศอีเมลของคุณ โปรดดู\n{{canonicalurl:{{#special:Preferences}}}}\n\nในการเปลี่ยนการตั้งค่ารายการเฝ้าดูของคุณ โปรดดู\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nในการลบหน้าจากรายการเฝ้าดูของคุณ โปรดดู\n$UNWATCHURL\n\nผลป้อนกลับและความช่วยเหลือเพิ่มเติม:\n$HELPPAGE",
        "created": "ถูกสร้าง",
        "changed": "ถูกเปลี่ยนแปลง",
        "deletepage": "ลบหน้า",
        "feedback-thanks": "ขอบคุณ! ผลป้อนกลับของคุณถูกโพสต์ไปยังหน้า \"[$2 $1]\" แล้ว",
        "searchsuggest-search": "ค้นหา {{SITENAME}}",
        "searchsuggest-containing": "มี...",
-       "api-error-badaccess-groups": "คุณไม่ได้รับอนุญาตให้อัปโหลดไฟล์มายังวิกินี้",
-       "api-error-empty-file": "ไฟล์ที่คุณส่งมานั้นว่าง",
        "api-error-emptypage": "ไม่อนุญาตให้สร้างหน้าใหม่ที่ว่าง",
-       "api-error-file-too-large": "ไฟล์ที่คุณส่งมาใหญ่เกินไป",
-       "api-error-filename-tooshort": "ชื่อไฟล์สั้นเกินไป",
-       "api-error-filetype-banned": "ไฟล์ประเภทนี้ถูกห้าม",
-       "api-error-mustbeloggedin": "กรุณาลงชื่อเข้าใช้เพื่ออัปโหลดไฟล์",
-       "api-error-ratelimited": "คุณกำลังพยายามอัปโหลดไฟล์ภายในระยะห่างเวลาที่สั้นเกินกว่าที่วิกินี้อนุญาต\nโปรดรอสักครู่แล้วลองใหม่อีกครั้ง",
-       "api-error-uploaddisabled": "การอัปโหลดถูกปิดใช้งานบนวิกินี้",
        "duration-seconds": "$1 วินาที",
        "duration-minutes": "$1 นาที",
        "duration-hours": "$1 ชั่วโมง",
index 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 f47f0f3..a9a2760 100644 (file)
                        "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",
        "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ü",
        "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",
-       "userrights-viewusergroup": "Kullanıcının gruplarını gör",
-       "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",
        "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.",
        "feedback-thanks": "Teşekkürler! Görüşleriniz \"[$2 $1]\" sayfasında paylaşılmıştır.",
        "feedback-thanks-title": "Teşekkürler!",
        "feedback-useragent": "Kullanıcı temsilcisi",
-       "searchsuggest-search": "Ara",
+       "searchsuggest-search": "{{SITENAME}} üzerinde ara",
        "searchsuggest-containing": "içeren...",
-       "api-error-badaccess-groups": "Bu wiki için dosya yüklemenize izin verilmiyor.",
        "api-error-badtoken": "İç hata: Bozuk anahtar.",
-       "api-error-copyuploaddisabled": "URL ile yükleme bu sunucuda devre dışı bırakılmıştır.",
-       "api-error-duplicate": "Sitede zaten aynı içerikte başka {{PLURAL:$1|bir dosya|dosyalar}} mevcut.",
-       "api-error-duplicate-archive": "Sitede zaten aynı içerikte başka {{PLURAL:$1|bir dosya|dosyalar}} vardı, ama {{PLURAL:$1|silindi|silindiler}}.",
-       "api-error-empty-file": "Gönderdiğiniz dosya boş.",
        "api-error-emptypage": "Yeni, boş bir sayfa oluşturmaya izin verilmez.",
-       "api-error-fetchfileerror": "İç hata: Dosya alınırken bir hata oluştu.",
-       "api-error-fileexists-forbidden": "\"$1\" adıyla bir dosya zaten mevcut dolayısıyla üzerine yazamazsınız.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" adında bir dosya ortak havuzda zaten var, ve üzerine yazılamaz.",
-       "api-error-file-too-large": "Gönderdiğiniz dosya çok büyük.",
-       "api-error-filename-tooshort": "Dosya adı çok kısa.",
-       "api-error-filetype-banned": "Bu dosya biçimi yasaklanmıştır.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|izin verilen bir dosya türü değil|izin verilen dosya türleri değil}}. İzin verilen {{PLURAL:$3|dosya türü|dosya türleri}} $2.",
-       "api-error-filetype-missing": "Dosya uzantısı eksik.",
-       "api-error-hookaborted": "Yapmaya çalıştığınız değişiklik bir eklenti tarafından iptal edildi.",
-       "api-error-http": "İç hata: sunucu ile bağlantı kurulamıyor.",
-       "api-error-illegal-filename": "Bu dosya adına izin verilmiyor.",
-       "api-error-internal-error": "İç hata: Wiki'ye yükleme yapma işleminizde bir şeyler ters gitti.",
-       "api-error-invalid-file-key": "İç hata: geçici depolama dosyası bulunamadı.",
-       "api-error-missingparam": "İç hata: İstenilen parametreler eksik.",
-       "api-error-missingresult": "İç hata: Kopyalamanın başarılı olup olmadığı belirlenemedi.",
-       "api-error-mustbeloggedin": "Dosya yükleyebilmek için oturum açmanız gereklidir.",
-       "api-error-mustbeposted": "İç hata: İstek HTTP POST gerektiriyor.",
-       "api-error-noimageinfo": "Yükleme başarılı oldu, ancak sunucu, bize dosya hakkında herhangi bir bilgi vermedi.",
-       "api-error-nomodule": "İç hata: Yükleme modülü ayarı yapılmadı.",
-       "api-error-ok-but-empty": "İç hata: Sunucu yanıt vermiyor.",
-       "api-error-overwrite": "Varolan dosyanın üzerine yazmaya izin verilmiyor.",
-       "api-error-stashfailed": "İç hata: Sunucu, geçici dosyaları kaybetti.",
        "api-error-publishfailed": "İç hata: Sunucu geçici dosyayı yayınlarken başarısız oldu.",
-       "api-error-stasherror": "Dosya zulaya yüklenirken hata oluştu.",
-       "api-error-stashedfilenotfound": "Saklandığı yerden yüklenmeye çalışılan dosya bu yerde bulunamadı.",
-       "api-error-stashpathinvalid": "Saklanan dosyanın bulunması beklenen yer bilgisi geçersiz.",
-       "api-error-stashfilestorage": "Dosya zulaya saklanmaya çalışılırken hata ile karşılaşıldı.",
-       "api-error-stashzerolength": "Sunucu dosyayı zulada saklayamadı; çünkü dosya boyutu sıfır uzunlukta.",
-       "api-error-stashnotloggedin": "Dosya yükleme zulasına dosya kaydetmek için oturum açmış olmanız gerekiyor.",
-       "api-error-stashwrongowner": "Zulada erişmeye çalıştığınız belge size ait değil.",
-       "api-error-stashnosuchfilekey": "Zulaya erişmeye çalışırken kullanılan dosya anahtarı mevcut değil.",
-       "api-error-timeout": "Sunucu beklenen süre içinde yanıt vermedi.",
-       "api-error-unclassified": "Bilinmeyen bir hata oluştu.",
-       "api-error-unknown-code": "Bilinmeyen hata: \"$1\"",
-       "api-error-unknown-error": "İç hata: Dosya yüklemeye çalışırken bir şeyler ters gitti.",
+       "api-error-stashfailed": "İç hata: Sunucu, geçici dosyaları kaybetti.",
        "api-error-unknown-warning": "Bilinmeyen uyarı: $1",
        "api-error-unknownerror": "Bilinmeyen hata: \"$1\".",
-       "api-error-uploaddisabled": "Yükleme bu vikide devre dışı bırakılmıştır.",
-       "api-error-verification-error": "Dosya bozuk veya yanlış uzantıya sahip olabilir.",
        "duration-seconds": "$1 {{PLURAL:$1|saniye|saniye}}",
        "duration-minutes": "$1 {{PLURAL:$1|dakika|dakika}}",
        "duration-hours": "$1 {{PLURAL:$1|saat|saat}}",
index ad6ac64..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": "Хисап язмазын булдыруда хата китте",
        "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() функциясендә билгесез хата",
        "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": "Хәтерне еш кулланучы функцияләр күп булган битләр",
        "saveprefs": "Саклау",
        "restoreprefs": "Башлангыч көйләнмәләрне кире кайтару",
        "prefs-editing": "Төзәтү",
-       "rows": "Юллар:",
-       "columns": "Баганалар:",
        "searchresultshead": "Эзләү",
        "stub-threshold": "Ясалма сылтамаларның бизәлеше буенча чикләүләр ($1):",
        "stub-threshold-sample-link": "мисал",
        "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": "Көндәлекләр",
        "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-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 bac27db..c357658 100644 (file)
        "saveprefs": "Шыгжаары",
        "restoreprefs": "Шупту баштайгы ниити шилилгелерни restore",
        "prefs-editing": "Өскертир",
-       "rows": "Одуруглар:",
-       "columns": "Баганалар:",
        "searchresultshead": "Дилээр",
        "timezoneuseserverdefault": "Викиниң ниити шилилгезин ажыглаары ($1)",
        "servertime": "Серверниң шагы:",
        "hours": "{{PLURAL:$1|1=$1 шак|$1 шак}}",
        "days": "{{PLURAL:$1|1=$1 хүн|$1 хүн}}",
        "ago": "$1 бурунгаар",
-       "bad_image_list": "ФоÑ\80мадÑ\8b Ð¼Ñ\8bндÑ\8bг Ð±Ð¾Ð¾Ñ\80 Ñ\83жÑ\83Ñ\80лÑ\83г:\n\nЧүгле Ð´Ð°Ò£Ð·Ñ\8bнÑ\8bÒ£ Ð¸Ð´ÐµÐ³ÐµÑ\82Ñ\82еÑ\80и (Ñ\8dлеменÑ\82илеÑ\80и) Ñ\81анаÑ\82Ñ\8bнаÑ\80 Ð±Ð¾Ð¾Ñ\80 (* Ð´ÐµÐ¿ Ð´ÐµÐ¼Ð´ÐµÐºÑ\82ен Ñ\8dгелÑ\8dÑ\8dн Ð¾Ð´Ñ\83Ñ\80Ñ\83глаÑ\80).\nÐ\9eдÑ\83Ñ\80Ñ\83гнÑ\83Ò£ Ð±Ð¸Ñ\80ги Ñ\88өлүдүү Ñ\81алдÑ\8bнмаÑ\81 Ñ\87Ñ\83Ñ\80Ñ\83малÑ\87е Ñ\88өлүдүг Ð±Ð¾Ð»Ñ\83Ñ\80Ñ\83 Ð°Ð»Ð±Ð°Ð½.\nÐ\9eл-ла Ð¾Ð´Ñ\83Ñ\80Ñ\83гнÑ\83Ò£ Ð°Ñ\80Ñ\82кан Ñ\88өлүдүглеÑ\80и Ð¾Ð½Ð·Ð°Ð³Ð°Ð¹ ÐºÑ\8bлдÑ\8bÑ\80 Ð°Ð·Ñ\8b Ñ\87Ñ\83Ñ\80Ñ\83мал ÐºÐ°Ð¿Ñ\81Ñ\8bÑ\80Ñ\8bп Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\87үүлдеÑ\80 ÐºÑ\8bлдÑ\8bÑ\80 Ñ\81анаÑ\82Ñ\82Ñ\8bнар.",
+       "bad_image_list": "ФоÑ\80мадÑ\8b Ð¼Ñ\8bндÑ\8bг Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\83жÑ\83Ñ\80лÑ\83г:\n\nÐ\94аңзÑ\8bда Ñ\87үгле Ñ\8dлеменÑ\82илеÑ\80 Ñ\81анаÑ\82Ñ\8bнаÑ\80 (* Ð´ÐµÐ¿ Ð´ÐµÐ¼Ð´ÐµÐºÑ\82ен Ñ\8dгелÑ\8dÑ\8dн Ð¾Ð´Ñ\83Ñ\80Ñ\83глаÑ\80).\nÐ\9eдÑ\83Ñ\80Ñ\83гда Ð±Ð¸Ñ\80 Ð´Ñ\83гааÑ\80 Ð°Ð¹Ñ\82Ñ\8bг Ð±Ð¾Ð»Ð·Ð° ÐºÐ¸Ð¸Ñ\80 Ð±Ð¸Ð¶Ð¸Ñ\82Ñ\82инмеÑ\81 Ñ\87Ñ\83Ñ\80Ñ\83кÑ\87е Ð°Ð¹Ñ\82Ñ\8bÑ\80 Ñ\83жÑ\83Ñ\80лÑ\83г.\nÐ\9eл-ла Ð¾Ð´Ñ\83Ñ\80Ñ\83гнÑ\83Ò£ Ó©Ñ\81ке Ð°Ð¹Ñ\82Ñ\8bглаÑ\80Ñ\8b, Ñ\87Ñ\83Ñ\80Ñ\83кÑ\82аÑ\80нÑ\8b ÐºÐ¸Ð¸Ñ\80 Ð±Ð¸Ð¶Ð¸Ð´Ð¸Ð¿ Ð±Ð¾Ð»Ñ\83Ñ\80 Ð°Ñ\80Ñ\8bннаÑ\80же Ð°Ð¹Ñ\82Ñ\8bп Ñ\82Ñ\83Ñ\80ар.",
        "metadata": "Чурумал дугайында медээлер",
        "metadata-help": "Бо файлда цифралыг камераларның болгаш сканерлерниң немеп каары немелде медээлер бар. Файлды кылган соонда эдип турган болза, ооң чамдык параметрлери ооң амгы чуруунга дүүшпес бооп болур.",
        "metadata-fields": "Бо даңзыда айыткан чурумалдар метаданныйларның кезектери чурумалдың арынынга көстүп кээр, метаданныйлар таблицазын дүрүп каан болур. \nАрткан кезектер аайлаан ёзугаар чажыт көстүр.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
index cb87aa9..a5dbfef 100644 (file)
        "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": "Утчан",
        "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": "Кутскон бам",
        "viewsourcetext": "Тӥ быгатӥськоды та бамлэсь кодзэ учкыны но кӧчырыны.",
        "viewyourtext": "Тӥ быгатӥськоды та бамез <strong>тӥляд тупатонъёстылэсь</strong> кодзэс учкыны но кӧчырыны.",
        "protectedinterface": "Та бам возе интерфейс текстэз та викилэн программной обеспечениезлы. Вандализмез палэнтон понна со утемын воштонъёслэсь.\nВань викиослы берыктэмъёсты ватсалляны яке вошъяны вылысь, тауна, MediaWiki локализацияя сайтэ выжелэ — [https://translatewiki.net/ translatewiki.net].",
-       "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.",
+       "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": "Ð\92ики-авÑ\82оÑ\80лÑ\8dн Ð½Ð¸Ð¼Ñ\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": "Лушкемкыл",
        "userlogin-yourpassword-ph": "Гожтэ асьтэлэсь парольдэс",
        "createacct-yourpassword-ph": "Гожтэ паролез",
-       "createacct-yourpasswordagain": "Ð\9fаÑ\80олÑ\8c Ñ\8eнмаÑ\82Ñ\8d",
+       "createacct-yourpasswordagain": "ЮнмаÑ\82Ñ\8d Ð¿Ð°Ñ\80олез",
        "createacct-yourpasswordagain-ph": "Гожтэ паролез эшшо одӥг пол",
-       "userlogin-remembermypassword": "Кылем сӧзнэтэз",
+       "userlogin-remembermypassword": "Кылёно системаын",
        "cannotcreateaccount-title": "Учётной записьёсты кылдытыны уг луы",
-       "yourdomainname": "Тӥ доменэн:",
+       "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": "Тон эн тусбуяськыны сӧзнэтэз",
+       "notloggedin": "Ӧд пыре системае",
        "userlogin-noaccount": "Ас учётной записьты ӧвӧл?",
        "userlogin-joinproject": "Проектэ пыриськоно",
-       "nologin": "УÑ\87Ñ\91Ñ\82ной ÐºÐ½Ð¸Ð³Ð° Ó§Ð²Ó§Ð»-а? $1.",
-       "nologinlink": "Ð\92Ñ\8bлÑ\8c Ð²Ð¸ÐºÐ¸-авÑ\82оÑ\80лÑ\8dн Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иез",
-       "createaccount": "Выль вики-авторлэн регистрациез",
-       "gotaccountlink": "Пырыны",
+       "nologin": "УÑ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ó§Ð²Ó§Ð»? $1.",
+       "nologinlink": "УÑ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81ез ÐºÑ\8bлдÑ\8bÑ\82Ñ\8bнÑ\8b",
+       "createaccount": "Выль викиавторлэн регистрациез",
+       "gotaccountlink": "Пырелэ",
        "userlogin-resetpassword-link": "Тӥлесьтыд парольдэс куштыны?",
        "userlogin-helplink2": "Пыронъя юрттэт",
-       "createacct-emailrequired": "Электронной почталэн адресэз",
-       "createacct-emailoptional": "Электронной почтаезлэн адресэз (необязательное)",
+       "createacct-emailrequired": "Электрон почталэн адресэз",
+       "createacct-emailoptional": "Электрон почталэн адресэз (одно ик ӧвӧл)",
        "createacct-email-ph": "Гожтэ асьтэлэн электрон почтадылэсь адрессэ",
-       "createaccountmail": "Ð\90дÑ\80еÑ\81 Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82а Ð¾Ð³Ð´Ñ\8bÑ\80лÑ\8b ÐºÑ\83Ñ\82Ó¥ Ð²Ñ\8bлÑ\8bн Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8dм Ð¾Ð±Ñ\80азÑ\8aÑ\91Ñ\81Ñ\8bнÑ\8bз Ð½Ð¾ Ñ\81ооÑ\81лÑ\8dн Ñ\81лÑ\83Ñ\87айной Ñ\81генеÑ\80иÑ\80оваÑ\82Ñ\8c Ð¿Ð°Ñ\80олÑ\8c Ñ\8bÑ\81Ñ\82Ñ\8bнÑ\8b",
-       "createacct-submit": "Ð\92Ñ\8bлÑ\8c Ð²Ð¸ÐºÐ¸-авÑ\82оÑ\80лÑ\8dн Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иез",
-       "createacct-another-submit": "Ð\92Ñ\8bлÑ\8c Ð²Ð¸ÐºÐ¸-авÑ\82оÑ\80лÑ\8dн Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иез",
+       "createaccountmail": "ЭÑ\80каз Ð¼Ð°Ð»Ð¿Ð°Ñ\81Ñ\8cкÑ\8bÑ\82Ñ\8dк ÐºÑ\8bлдÑ\8bÑ\82Ñ\8bнÑ\8b Ð¾Ð³Ð´Ñ\8bÑ\80лÑ\8b Ð¿Ð°Ñ\80олез Ð½Ð¾ Ñ\8bÑ\81Ñ\82Ñ\8bнÑ\8b Ñ\81ое Ñ\8dлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82алÑ\8dн Ð³Ð¾Ð¶Ñ\82Ñ\8dм Ð°Ð´Ñ\80еÑ\81аз",
+       "createacct-submit": "УÑ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cÑ\82Ñ\8dÑ\81 ÐºÑ\8bлдÑ\8bÑ\82оно",
+       "createacct-another-submit": "УÑ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81ез ÐºÑ\8bлдÑ\8bÑ\82оно",
        "createacct-benefit-heading": "{{SITENAME}} — тӥ выллем адямиослэн валче ужамзы.",
        "createacct-benefit-body1": "{{PLURAL:$1|тупатон}}",
        "createacct-benefit-body2": "{{PLURAL:$1|бам}}",
        "createacct-benefit-body3": "{{PLURAL:$1|викиавтор}} берло дыре",
-       "loginerror": "ЯнгÑ\8bÑ\88Ñ\8aÑ\91Ñ\81 Ð¿Ñ\8bÑ\80он",
-       "createacct-error": "ЯнгÑ\8bÑ\88Ñ\8aÑ\91Ñ\81 Ð±Ð¾Ñ\80дÑ\8bн Ñ\83Ñ\87Ñ\91Ñ\82ной ÐºÐ½Ð¸Ð³Ð° ÐºÑ\8bлдÑ\8bÑ\82Ñ\8bнÑ\8b",
+       "loginerror": "Ð\9fÑ\8bÑ\80он Ñ\8fнгÑ\8bÑ\88",
+       "createacct-error": "УÑ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81ез ÐºÑ\8bлдÑ\8bÑ\82он Ñ\8fнгÑ\8bÑ\88",
        "createaccounterror": "Учётной запись кылдытыны уг луы: $1",
        "nocookiesnew": "Викиавтор регистрировать каремын, нош тӥ сайтэ ӧд пырелэ.\n{{SITENAME}} «cookies» уже кутэ викиавторъёсты сайтэ лэзьылыны вылысь.\nТӥляд «cookies-ты» ӧвӧл.\nТауна лэзе соосты, собере пыре сайтэ асьтэлэн выль викиавтор нименыды но пароленыды.",
-       "nocookieslogin": "{{SITENAME}} пользователь cookies пырон понна кутыны.\nDisconnect cookies тонэ дорам.\nПожалуйста, соосты утчано, выльысь гожтыны.",
-       "blocked-mailpassword": "Тон IP-адрес заблокировать-ысь редактировать карон. Злоупотребление предотвращение понна, та понна кутыны ӧз лэзиське пароль-ысь восстановление IP-адрес.",
+       "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": "Выль лушкемкыл:",
        "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Тауна пыртэ вань та пыр-поч сведениосыз асьтэлэн куронъёсады.",
        "blockednoreason": "пуктэм муг ӧвӧл",
-       "whitelistedittext": "Тон ÐºÑ\83лÑ\8d $1 Ð±Ð°Ð¼ Ð²Ð¾Ñ\88Ñ\82он Ð¿Ð¾Ð½Ð½Ð°.",
-       "loginreqtitle": "Ð\90вÑ\82оÑ\80изаÑ\86иÑ\8f ÐºÑ\83лÑ\8d",
+       "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> Тӥ дорын сётӥське юаськыны кылдӥз бам ӧвӧл.",
+       "noarticletext-nopermission": "Али дыре та бамын текст ӧвӧл.\nТӥ быгатоды [[Special:Search/{{PAGENAME}}|шедьтыны со сярысь кыӵе ке ивор]] мукет бамъёсысь, яке <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} шедьтыны журналъёсысь гожъямъёсыз]</span>, нош та бамез кылдытыны тӥляд лэзёнды ӧвӧл.",
        "blocked-notice-logextract": "Та викиавтор али заблокировать каремын.\nБлокировкаосын журналысь берпум гожъям улӥ возьматэмын:",
        "continue-editing": "Тупатъянэз азьланьтоно",
        "editing": "Тупатон: $1",
        "editingsection": "Тупатон: $1 (люкет)",
        "templatesused": "Та бам пушкы пыртэм {{PLURAL:$1|шаблон|шаблонъёс}}:",
        "template-protected": "(утемын)",
-       "template-semiprotected": "(полуутемын)",
+       "template-semiprotected": "(ӧжытак утемын)",
        "hiddencategories": "Та бам пыре {{PLURAL:$1|$1 ватэм категорие}}:",
-       "nocreatetext": "Та сайтлэн бамаз выль сюбегатэм луонлыкъёсын кылдытон.\nТон улыса, берлань вуэ быгатэ бам отредактировать, [[Special:UserLogin|тусбуяськыны книгае яке выль система кылдыто учётной]].",
-       "nocreate-loggedin": "Тон Ð´Ð¾Ñ\80азÑ\8b Ñ\8eаÑ\81Ñ\8cкÑ\8bнÑ\8b ÐºÑ\8bлдӥз Ð²Ñ\8bлÑ\8c Ð±Ð°Ð¼ ӧвӧл.",
-       "permissionserrors": "ЯнгÑ\8bÑ\88Ñ\8aÑ\91Ñ\81 Ñ\8eаÑ\81Ñ\8cке",
-       "permissionserrorstext": "Тон дорын разрешенизы ӧвӧлэн, тазэ лэсьтом шуыса, со понна вуоно {{PLURAL:$1|мугез}}:",
-       "permissionserrorstext-withaction": "Ð\9fÑ\80авоез Ó§Ð²Ó§Ð», Ñ\82он Ð´Ð¾Ñ\80Ñ\8bн $2 Ñ\82Ó¥ {{PLURAL:$1/1=мÑ\83гез Ð²Ñ\83оно|мÑ\83гез Ð²Ñ\83оно}}:",
+       "nocreatetext": "{{SITENAME}} сюбегомытӥз луонлыкез выль бамъёсты кылдытъяны.\nТӥ быгатӥськоды берытскыны но азьло кылдытэм бам тупатыны, [[Special:UserLogin|системае пырыны яке выль аккаунт кылдытыны]].",
+       "nocreate-loggedin": "Ð\92Ñ\8bлÑ\8c Ð±Ð°Ð¼Ñ\8aÑ\91Ñ\81Ñ\82Ñ\8b ÐºÑ\8bлдÑ\8bÑ\82Ñ\8aÑ\8fнÑ\8b Ñ\82ӥлÑ\8fд Ð»Ñ\8dзÑ\91ндÑ\8b ӧвӧл.",
+       "permissionserrors": "Ð\9bÑ\8dзÑ\91н Ñ\8fнгÑ\8bÑ\88",
+       "permissionserrorstext": "Тӥляд тае быдэстыны лэзёнды ӧвӧл та {{PLURAL:$1|1=муген|мугъёсын}} сэрен:",
+       "permissionserrorstext-withaction": "ТӥлÑ\8fд $2 Ð»Ñ\8dзÑ\91ндÑ\8b Ó§Ð²Ó§Ð» Ñ\82а {{PLURAL:$1|1=мÑ\83ген|мÑ\83гÑ\8aÑ\91Ñ\81Ñ\8bн}} Ñ\81Ñ\8dÑ\80ен:",
        "moveddeleted-notice": "Та бам быдтэмын вал.\nБыдтонъёсын но ним воштонъёсын журналъёсысь ярано записьёс чӧлсконлы улӥ возьматэмын.",
        "content-model-wikitext": "викитекст",
-       "undo-summary": "Шонертон вошъян $1, лэсьтӥзы {{GENDER:$2|участник|куакеч}} [[Special:Contributions/$2|$2]] ([[User talk:$2|обс.]])",
+       "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": "Та бамлы журналъёсыз возьматыны",
        "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-тӥ чур:",
        "prefs-preview": "Бамез эскерон",
        "userrights": "Пыриськисьлэн правоосыныз кивалтон",
        "editusergroup": "Викиавторлэсь группаоссэ возьматыны",
-       "group-autoconfirmed": "Автоподтвержденный пыриськисьёс",
-       "group-bot": "Ð\91оÑ\82Ñ\8b",
+       "group-autoconfirmed": "Авто-юнматэм викиавторъёс",
+       "group-bot": "Ð\91оÑ\82Ñ\8aÑ\91Ñ\81",
        "group-sysop": "Администраторъёс",
        "group-all": "(ваньзэ)",
        "grouppage-sysop": "{{ns:project}}:Администраторъёс",
-       "right-read": "лÑ\8bдÓ\9fÑ\8bнÑ\8b Ð±Ð°Ð¼",
-       "right-edit": "пÑ\80авка Ð±Ð°Ð¼",
-       "right-createpage": "бам ÐºÑ\8bлдÑ\8bÑ\82он-а, Ñ\83г-возÑ\8cмаÑ\82Ñ\8dмзÑ\8d Ñ\8dÑ\81кеÑ\80он",
-       "right-createtalk": "создание бамлэн обсуждениосаз",
-       "right-createaccount": "вÑ\8bлÑ\8c ÐºÐ½Ð¸Ð³Ð° ÐºÑ\8bлдÑ\8bÑ\82он Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cкизÑ\8b Ñ\83Ñ\87Ñ\91Ñ\82ной",
-       "right-writeapi": "гожÑ\82Ñ\8dÑ\82Ñ\8aÑ\91Ñ\81Ñ\82Ñ\8b ÐºÑ\83Ñ\82он Ð¿Ð¾Ð½Ð½Ð° API",
-       "right-block": "мÑ\83кеÑ\82 Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81лÑ\8dÑ\81Ñ\8c ÐºÑ\83Ñ\80он-коÑ\81он Ð²Ñ\8bлÑ\8d Ñ\83Ñ\81Ñ\82ановкаоÑ\81Ñ\82Ñ\8b Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c",
+       "right-read": "Ð\91амÑ\8aÑ\91Ñ\81Ñ\82Ñ\8b Ñ\83Ñ\87кон",
+       "right-edit": "Ð\91амÑ\8aÑ\91Ñ\81Ñ\82Ñ\8b Ñ\82Ñ\83паÑ\82Ñ\8aÑ\8fн",
+       "right-createpage": "Ð\91амÑ\8aÑ\91Ñ\81Ñ\82Ñ\8b ÐºÑ\8bлдÑ\8bÑ\82он (веÑ\80аÑ\81Ñ\8cкон Ð±Ð°Ð¼Ñ\8aÑ\91Ñ\81 Ñ\81Ñ\8fна)",
+       "right-createtalk": "Вераськон бамъёсты кылдытон",
+       "right-createaccount": "Ð\92икиавÑ\82оÑ\80Ñ\8aÑ\91Ñ\81лÑ\8dÑ\81Ñ\8c Ð²Ñ\8bлÑ\8c Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cÑ\91Ñ\81Ñ\81Ñ\8dÑ\81 ÐºÑ\8bлдÑ\8bÑ\82он",
+       "right-writeapi": "Ð\93ожÑ\8aÑ\8fÑ\81Ñ\8c API Ñ\83же ÐºÑ\83Ñ\82он",
+       "right-block": "Ð\9cÑ\83кеÑ\82 Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81Ñ\82Ñ\8b Ñ\82Ñ\83паÑ\82Ñ\8aÑ\8fнлÑ\8dÑ\81Ñ\8c Ð¿Ð°Ð»Ñ\8dнÑ\82он",
        "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": "Выль тупатонъёслы настройкаос",
        "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": "Ӧвӧл",
        "sp-deletedcontributions-contribs": "тупатонъёсыз",
        "listusers-submit": "Возьматыны",
        "listusers-blocked": "(блокировать каремын)",
-       "listgrouprights": "Ð\9fÑ\80аво Ð³Ñ\80Ñ\83ппае Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81",
-       "listgrouprights-summary": "Та Ð³Ñ\80Ñ\83ппае Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cÑ\91Ñ\81 Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8bнÑ\8b ÐºÑ\83лÑ\8d Ð²Ð¸ÐºÐ¸ Ñ\81пиÑ\81ок Ñ\83лӥзÑ\8b, Ð¿Ñ\80аво Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вÑ\83Ñ\8eÑ\89ийгеÑ\81 Ñ\81олÑ\8b Ð²Ð¾Ð·Ñ\8cмаÑ\82оно ÐºÐ°Ñ\80иÑ\81Ñ\8cкиз. Ð\9eло, Ð°Ñ\81 [[{{MediaWiki:Listgrouprights-helppage}}|кожазÑ\8b Ð²Ð°Ñ\82Ñ\81аÑ\81а Ð¸Ð²Ð¾Ñ\80Ñ\82одÑ\8dÑ\82]] Ñ\83лÑ\8bнÑ\8b Ñ\8dÑ\80икÑ\80адÑ\8dз Ñ\81Ñ\8fÑ\80Ñ\8bÑ\81ь.",
-       "listgrouprights-members": "(список пыриськисьёс)",
+       "listgrouprights": "Ð\92икиавÑ\82оÑ\80Ñ\8aÑ\91Ñ\81лÑ\8dн Ð³Ñ\80Ñ\83ппаоÑ\81Ñ\81Ñ\8bлÑ\8dн Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8b",
+       "listgrouprights-summary": "Улӥ Ñ\81пиÑ\81ок Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8dмÑ\8bн Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81лÑ\8dн Ñ\82а Ð²Ð¸ÐºÐ¸Ñ\8bн ÐºÑ\8bлдÑ\8bÑ\82Ñ\8dм Ð³Ñ\80Ñ\83ппаоÑ\81Ñ\81Ñ\8bлÑ\8b, Ñ\81ооÑ\81Ñ\8bн Ð³ÐµÑ\80Ó\9fаÑ\81Ñ\8cкем Ð»Ñ\8dзÑ\91н Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8b ÓµÐ¾Ñ\88ен.\nÐ\9dимаз Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8b Ñ\81Ñ\8fÑ\80Ñ\8bÑ\81Ñ\8c, Ð¾Ð»Ð¾, [[{{MediaWiki:Listgrouprights-helppage}}|Ñ\8dÑ\88Ñ\88о Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f]] Ð²Ð°Ð½ь.",
+       "listgrouprights-members": "(викиавторъёсызлэн списоксы)",
        "emailuser": "Викиавторлы гожтэт",
        "emailmessage": "Ивортон:",
        "watchlist": "Чаклан список",
        "enotif_reset": "Вань бамъёсыз лыдӟем пусйыны",
        "historyaction-submit": "Возьматыны",
        "dellogpage": "Быдтонъёсын журнал",
-       "deletionlog": "палÑ\8dнÑ\8d журнал",
+       "deletionlog": "бÑ\8bдÑ\82онÑ\8aÑ\91Ñ\81Ñ\8bн журнал",
        "rollbacklink": "ӝог берыктыны",
        "rollbacklinkcount": "$1 {{PLURAL:$1|тупатонэз}} ӝог берыктыны",
-       "revertpage": "Откат шонертон [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) доры версия [[User:$1|$1]]",
-       "revertpage-nouser": "Ð\9eÑ\82каÑ\82 Ñ\88онеÑ\80Ñ\82он (пÑ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81 Ð²Ð°Ñ\82Ñ\8dм Ð½Ð¸Ð¼Ñ\8aÑ\91Ñ\81Ñ\81Ñ\8b) Ð´Ð¾Ñ\80Ñ\8b Ð²ÐµÑ\80Ñ\81иÑ\8f {{GENDER:$1|[[User:$1|$1]]}}",
+       "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|вераськон]]) викиавторлэн тупатонъёсыз берыктэмын [[User:$1|$1]] викиавторлэн версиезозь",
+       "revertpage-nouser": "Ð\92аÑ\82Ñ\8dм Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80лÑ\8dн Ñ\82Ñ\83паÑ\82онÑ\8aÑ\91Ñ\81Ñ\8bз Ð±ÐµÑ\80Ñ\8bкÑ\82Ñ\8dмÑ\8bн {{GENDER:$1|[[User:$1|$1]] Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80лÑ\8dн}} Ð²ÐµÑ\80Ñ\81иезозÑ\8c",
        "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|Викиавтор}} гожтэмъёсы",
        "mycontris": "Гожтэмъёс",
        "anoncontribs": "Гожтэмъёс",
        "contribsub2": "{{GENDER:$3|$1}} гожтэмъёсы ($2)",
-       "nocontribs": "Ð\9aÑ\80иÑ\82еÑ\80ии Ð½Ð¾ÐºÑ\8bӵе Ð²Ð¾Ñ\88Ñ\82Ó¥Ñ\81Ñ\8cконÑ\8aÑ\91Ñ\81 Ñ\82а Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вÑ\83Ñ\8eÑ\89ий Ñ\88едÑ\8cÑ\82Ñ\8bнÑ\8b Ñ\83г Ð»Ñ\83Ñ\8b.",
+       "nocontribs": "Та ÐºÑ\80иÑ\82еÑ\80иоÑ\81лÑ\8b ÐºÐµÐ»Ñ\8cÑ\88иÑ\81Ñ\8c Ð²Ð¾Ñ\88Ñ\82онÑ\8aÑ\91Ñ\81 Ñ\88едÑ\8cÑ\82Ñ\8dмÑ\8bн Ó§Ð²Ó§Ð».",
        "month": "Толэзьысен (вазен но):",
        "year": "Арысен (вазен но):",
-       "sp-contributions-blocklog": "блокировка",
-       "sp-contributions-deleted": "шонертон палэнтыны {{GENDER:$1|участник|куакеч}}",
+       "sp-contributions-blocklog": "блокировкаосыз",
+       "sp-contributions-deleted": "{{GENDER:$1|викиавторлэн}} быдтэм тупатонъёсыз",
        "sp-contributions-userrights": "пыриськисьлэн правоосыныз кивалтон",
-       "sp-contributions-blocked-notice": "Ð\9fолÑ\8cзоваÑ\82елÑ\8c Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c Ñ\81Ñ\91Ñ\82ӥз Ñ\82а Ñ\83Ñ\87Ñ\8bÑ\80лÑ\8b. Ð¡Ð¿Ñ\80авка Ð¿Ð¾Ð½Ð½Ð° Ñ\80адÑ\8aÑ\8fÑ\81Ñ\8cкÑ\8bлӥÑ\81Ñ\8c Ð¶Ñ\83Ñ\80нал Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка Ð»Ð°Ð¿ÐµÐ³ Ð±ÐµÑ\80пÑ\83меÑ\82Ó¥ Ð³Ð¾Ð¶Ñ\82Ñ\8dÑ\82:",
-       "sp-contributions-blocked-notice-anon": "Со ip-адÑ\80еÑ\81 Ð²Ð¸Ðµ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c Ñ\81Ñ\91Ñ\82ӥзÑ\8b. Ð\91локиÑ\80овка Ð¶Ñ\83Ñ\80налÑ\8aÑ\91Ñ\81Ñ\82Ñ\8b Ð²Ð°Ð¹Ñ\8bÑ\82Ñ\8dк Ñ\83лӥзÑ\8b Ð±ÐµÑ\80пÑ\83меÑ\82Ó¥ ÐºÐ½Ð¸Ð³Ð°Ñ\8bÑ\81Ñ\8c:",
+       "sp-contributions-blocked-notice": "Ð\90ли Ð´Ñ\8bÑ\80е Ñ\82а Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80емÑ\8bн.\nÐ\92алÑ\8dкÑ\82он Ð¿Ð¾Ð½Ð½Ð° Ð±Ð»Ð¾ÐºÐ¸Ñ\80овкаоÑ\81Ñ\8bн Ð¶Ñ\83Ñ\80налÑ\8bÑ\81Ñ\8c Ð±ÐµÑ\80ло Ð³Ð¾Ð¶Ñ\8aÑ\8fм Ñ\83лӥ Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8dмÑ\8bн:",
+       "sp-contributions-blocked-notice-anon": "Ð\90ли Ð´Ñ\8bÑ\80е Ñ\82а IP-адÑ\80еÑ\81 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80емÑ\8bн.\nÐ\92алÑ\8dкÑ\82он Ð¿Ð¾Ð½Ð½Ð° Ð±Ð»Ð¾ÐºÐ¸Ñ\80овкаоÑ\81Ñ\8bн Ð¶Ñ\83Ñ\80налÑ\8bÑ\81Ñ\8c Ð±ÐµÑ\80ло Ð³Ð¾Ð¶Ñ\8aÑ\8fм Ñ\83лӥ Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8dмÑ\8bн:",
        "sp-contributions-submit": "Шедьтыны",
        "whatlinkshere": "Татчы чӧлсконъёс",
        "whatlinkshere-title": "«$1» вылэ чӧлскись бамъёс",
        "whatlinkshere-filters": "Фильтръёс",
        "block": "Викиавторез заблокировать карыны",
        "blockip": "{{GENDER:$1|Викиавторез}} заблокировать карыны",
-       "blockip-legend": "Ð\91локиÑ\80овка Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81",
-       "blockiptext": "ФоÑ\80мазÑ\8d Ñ\83же ÐºÑ\83Ñ\82Ñ\8bÑ\81а, ÐºÑ\83лÑ\8d Ð»Ñ\83Ñ\8dмезÑ\8aÑ\8f Ð¼ÐµÐ´ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c Ð³Ð¾Ð¶Ñ\8aÑ\8fн IP-адÑ\80еÑ\81 Ñ\8fке Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81лÑ\8dн Ð½Ð¸Ð¼Ñ\8aÑ\91Ñ\81Ñ\81Ñ\8b.\nТа Ð¿Ð¾Ð½Ð½Ð° Ð³Ð¸Ð½Ñ\8d Ð½Ð¾ Ñ\81оÑ\8f Ð³Ð¸Ð½Ñ\8d Ð»Ñ\8dÑ\81Ñ\8cÑ\82Ñ\8dмÑ\8bн Ð»Ñ\83Ñ\8bнÑ\8b Ð±Ñ\8bгаÑ\82оз Ð²Ð°Ð½Ð´Ð°Ð»Ð¸Ð·Ð¼ Ð¿Ñ\80едоÑ\82вÑ\80аÑ\89ение Ñ\81 [[{{MediaWiki:Policy-url}}|пÑ\80авилооÑ\81Ñ\82Ñ\8b]].\nÐ\9cÑ\83гез Ð²Ð¾Ð·Ñ\8cмаÑ\82иÑ\81Ñ\8c Ñ\83лӥзÑ\8b Ñ\87ленÑ\8aÑ\91Ñ\81Ñ\8bн (кÑ\8bлÑ\81Ñ\8fÑ\80Ñ\8bÑ\81Ñ\8c, ÐºÑ\83д-ог Ñ\82одмеÑ\82Ñ\8aÑ\91Ñ\81Ñ\81Ñ\8d Ð²Ð°Ð½Ð´Ð°Ð»Ð¸Ð·Ð¼ Ñ\86иÑ\82иÑ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80оно Ð±Ð°Ð¼).\nТӥ Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cкодÑ\8b Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ\8dз Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c IP-адÑ\80еÑ\81, Ñ\83же ÐºÑ\83Ñ\82Ñ\8bнÑ\8b [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]-Ñ\81инÑ\82акÑ\81иÑ\81. Ð\9cакÑ\81ималÑ\8cно Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ\8dз Ð´Ð¾Ð¿Ñ\83Ñ\81Ñ\82имÑ\8bй â\80\94 /$1 Ð¿Ñ\80оÑ\82окол Ð¿Ð¾Ð½Ð½Ð° IPv4 Ð½Ð¾ /$2 Ð¿Ñ\80оÑ\82окол Ð¿Ð¾Ð½Ð½Ð° IPv6.",
-       "ipbreason-dropdown": "* Блокировка мугез кабес\n** Полы информациез оскизы\n** Вордскем палэнэ бам\n** Спам-сайтъя педпал чӧлскон\n** Текстлэсь визьем ватсан/жуг-жаг\n** Кышкытлыклэсь, пыриськыны уйиськон\n** Злоупотребление кӧня ке книга учётной\n** Пыриськисьёслэн нимъёссы пыриськисьёс",
-       "ipbsubmit": "Ð\90дÑ\80еÑ\81Ñ\8aÑ\91Ñ\81Ñ\8bн Ñ\82а Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c/пÑ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81",
-       "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",
+       "blockip-legend": "Ð\92икиавÑ\82оÑ\80ез Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка",
+       "blockiptext": "Ð\9aÑ\83Ñ\82Ñ\8d Ñ\82а Ñ\84оÑ\80маез Ð³Ð¾Ð¶Ñ\82Ñ\8bлÑ\8bнÑ\8b Ð»Ñ\83онлÑ\8bкез Ð´Ñ\83гдÑ\8bÑ\82Ñ\8bнÑ\8b Ð²Ñ\8bлÑ\8bÑ\81Ñ\8c Ð±Ñ\8bÑ\80Ñ\8aем IP-адÑ\80еÑ\81Ñ\8bÑ\81Ñ\8c Ñ\8fке Ð¾Ð³ Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80 Ð½Ð¸Ð¼ Ñ\83лÑ\81Ñ\8bн.\nТае Ð»Ñ\8dÑ\81Ñ\8cÑ\82Ñ\8bнÑ\8b ÐºÑ\83лÑ\8d Ð²Ð°Ð½Ð´Ð°Ð»Ð¸Ð·Ð¼ÐµÐ· Ð¿Ð°Ð»Ñ\8dнÑ\82он Ð¿Ð¾Ð½Ð½Ð° Ð³Ð¸Ð½Ñ\8d Ð½Ð¾ [[{{MediaWiki:Policy-url}}|пÑ\80авилооÑ\81Ñ\8aÑ\8f]] Ð³Ð¸Ð½Ñ\8d.\nУлӥ ÐºÐ¾Ð½ÐºÑ\80еÑ\82ной Ð¼Ñ\83гез Ð³Ð¾Ð¶Ñ\82Ñ\8d (кÑ\8bлÑ\81Ñ\8fÑ\80Ñ\8bÑ\81Ñ\8c, Ñ\86иÑ\82иÑ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80Ñ\8bÑ\81а Ð²Ð°Ð½Ð´Ð°Ð»Ñ\8dн Ñ\81Ó§Ñ\80ем ÐºÑ\83д-ог Ð±Ð°Ð¼Ñ\8aÑ\91Ñ\81Ñ\82Ñ\8b).\nТӥ Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cкодÑ\8b IP-адÑ\80еÑ\81Ñ\8aÑ\91Ñ\81лÑ\8dÑ\81Ñ\8c Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ\8aÑ\91Ñ\81Ñ\81Ñ\8dÑ\81 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80Ñ\8bнÑ\8b [https://ru.wikipedia.org/wiki/Ð\91еÑ\81клаÑ\81Ñ\81оваÑ\8f_адÑ\80еÑ\81аÑ\86иÑ\8f CIDR]-Ñ\81инÑ\82акÑ\81иÑ\81 Ñ\83же ÐºÑ\83Ñ\82Ñ\8bÑ\81а; IPv4 Ð¿Ñ\80оÑ\82окол Ð¿Ð¾Ð½Ð½Ð° Ñ\81амой Ð±Ð°Ð´Ó\9fÑ\8bм Ð»Ñ\83оно Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ Ð»Ñ\83Ñ\8d /$1, Ð½Ð¾ IPv6 Ð¿Ñ\80оÑ\82окол Ð¿Ð¾Ð½Ð½Ð° â\80\94 /$2.",
+       "ipbreason-dropdown": "*Блокировкаослэн огшоры мугъёссы\n** Ӧрекчась информациез ватсан\n** Бамъёслэсь текстсэс быдтон\n** Спам-чӧлсконъёс педпал сайтъёс вылэ\n** Валантэм/жаг текстэз бамъёсы ватсан\n** Викиавторъёсыз кышкатъян/ултӥяллян\n** Лэзёнтэм ужан трос аккаунтъёсын\n** Викиавторлэн ярантэм нимыз",
+       "ipbsubmit": "Та Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80Ñ\8bнÑ\8b",
+       "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": "ноку",
-       "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аз",
+       "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": "Автоблокировка, малы ке шуоно «[[User:$1|$1]]» тӥлесьтыд IP-адрестэс алигес уже кутӥз.\n$1 блокировкалэн мугез: «$2»",
        "reblock-logentry": "воштӥз блокировкалэсь йылпумъянзэ [[$1]] понна дырлы: $2 $3",
        "blocklogtext": "Викиавторъёсты блокировкаосын но разблокировкаосын журнал.\nАвтоматически блокировать кариськись IP-адресъёс татын уг адӟытӥсько.\nУчке [[Special:BlockList|списокез али кутӥськись блокировкаослы]].",
        "unblocklogentry": "разблокировать кариз $1",
-       "block-log-flags-anononly": "полÑ\8cзоваÑ\82елÑ\8c Ð³Ð¸Ð½Ñ\8d Ð½Ð¸Ð¼Ñ\82Ñ\83лÑ\82Ñ\8dм",
-       "block-log-flags-nocreate": "регистрация учётной книгая ужъёсты быдэстон",
-       "block-log-flags-noemail": "лÑ\8dзÑ\8cÑ\8bмÑ\82Ñ\8d Ð³Ð¾Ð¶Ñ\82Ñ\8dÑ\82 Ñ\8bÑ\81Ñ\82он",
-       "block-log-flags-nousertalk": "Ñ\82Ñ\83паÑ\82Ñ\8aÑ\8fнÑ\8b Ð°Ñ\87из Ñ\83ггеÑ\81 Ð±Ñ\8bгаÑ\82Ñ\8b Ð±Ð°Ð¼Ð»Ñ\8dн Ð¾Ð±Ñ\81Ñ\83ждениоÑ\81аз",
+       "block-log-flags-anononly": "аноним Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81 Ð³Ð¸Ð½Ñ\8d",
+       "block-log-flags-nocreate": "аккаунтъёсыз кылдытон дугдытэмын",
+       "block-log-flags-noemail": "гожÑ\82Ñ\8dÑ\82Ñ\8aÑ\91Ñ\81Ñ\8bз Ñ\8bÑ\81Ñ\82Ñ\8bлÑ\8bнÑ\8b Ñ\83г Ð»Ñ\83Ñ\8b",
+       "block-log-flags-nousertalk": "Ñ\83г Ð±Ñ\8bгаÑ\82Ñ\8b Ð°Ñ\81 Ð²ÐµÑ\80аÑ\81Ñ\8cкон Ð±Ð°Ð¼Ð·Ñ\8d Ð²Ð¾Ñ\88Ñ\8aÑ\8fнÑ\8b",
        "range_block_disabled": "Администраторъёслэн диапазонъёсыз блокировать карыны луонлыксы дугдытэмын.",
        "move-watch": "Чаклан списоке пыртоно инъет но валтӥсь бамъёсыз",
        "movelogpage": "Нимъёсты воштонъёсын журнал",
        "exif-colorspace": "Буёлъёслэн пространствозы",
        "exif-datetimeoriginal": "Нырысь дата но дыр",
        "exif-datetimedigitized": "Цифраослы пӧрмытонлэн датаез но дырыз",
-       "exif-disclaimer": "Ð\9aÑ\8bл ÐºÑ\83Ñ\82Ñ\8bнÑ\8b Ð¿Ñ\83миÑ\82 Ð»Ñ\83он",
+       "exif-disclaimer": "Ð\9aÑ\8bл ÐºÑ\83Ñ\82Ñ\8dмлÑ\8dÑ\81Ñ\8c ÐºÑ\83Ñ\88Ñ\82Ó¥Ñ\81Ñ\8cкон",
        "exif-orientation-1": "Огшоры",
        "namespacesall": "ваньзэ",
        "monthsall": "ваньзэ",
-       "confirmrecreate-noreason": "{{GENDER:$1|Участник|Куакеч|}}&nbsp;[[User:$1|$1]] ([[User talk:$1|обс]]) {{GENDER:$1|палэнтыны|палэнтыны}} таиз бере бам, кызьы тон сое редактировать карыны кутскиз. Пожалуйста, подтвердите, мар тон малпаськод та бамез зэм но выльысь кылдозы.",
+       "confirmrecreate-noreason": "Тӥ та бам тупатыны кутскиды бере, [[User:$1|$1]] ([[User talk:$1|вер]]) викиавтор сое {{GENDER:$1|быдтӥз}}. Тауна, юнматэ, та бамез выльысь кылдытэмды зэм но потэ шуыса.",
        "confirm-watch-top": "Та бамез чаклан списокады пыртоно?",
        "autosumm-new": "Выль бам: «$1»",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|вераськон]])",
        "version": "Версия",
        "specialpages": "Ваньмыз панельёс",
-       "specialpages-group-login": "ТÑ\83Ñ\81бÑ\83Ñ\8fÑ\81Ñ\8cкÑ\8bнÑ\8b / Ð\93ожÑ\82Ó¥Ñ\81Ñ\8cконо",
-       "specialpages-group-users": "Ð\9fÑ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81лÑ\8dÑ\81Ñ\8c Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8dÑ\81 Ð½Ð¾",
+       "specialpages-group-login": "СиÑ\81Ñ\82емае Ð¿Ñ\8bÑ\80он / Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иÑ\8f",
+       "specialpages-group-users": "Ð\92икиавÑ\82оÑ\80Ñ\8aÑ\91Ñ\81 Ð½Ð¾ Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8b",
        "tag-filter": "[[Special:Tags|Тэгъёсыз]] фильтр:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Метка|Меткаос}}]]: $2)",
        "tags-title": "Меткаос",
-       "logentry-delete-delete": "$1 {{GENDER:$2|палÑ\8dнÑ\82Ñ\8bнÑ\8b|палÑ\8dнÑ\82Ñ\8bнÑ\8b}} Ð±Ð°Ð¼ $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|вÑ\8bлÑ\8cÑ\8bÑ\81Ñ\8c}} Ð±Ð°Ð¼ $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-delete-delete": "$1 {{GENDER:$2|бÑ\8bдÑ\82ӥз}} $3 Ð±Ð°Ð¼ÐµÐ·",
+       "logentry-delete-restore": "$1 {{GENDER:$2|беÑ\80ен Ñ\81Ñ\91Ñ\82ӥз}} $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 4fb0861..5d5c09f 100644 (file)
        "searcharticle": "Перейти",
        "history": "Історія сторінки",
        "history_short": "Історія",
+       "history_small": "історія",
        "updatedmarker": "оновлено після мого останнього перегляду",
        "printableversion": "Версія до друку",
        "permalink": "Постійне посилання",
        "selfredirect": "<strong>Попередження:</strong> Ви створюєте перенаправлення на цю ж сторінку.\nВи могли вказати невірну цільову сторінку, або ж редагуєте хибну сторінку.\nЯкщо Ви натиснете \"{{int:savearticle}}\" ще раз, перенаправлення буде створено.",
        "missingcommenttext": "Будь ласка, введіть нижче ваше повідомлення.",
        "missingcommentheader": "<strong>Нагадування</strong>: Ви не вказали тему для цього коментаря.\nНатиснувши кнопку «{{int:savearticle}}» ще раз, Ви збережете редагування без заголовка.",
-       "summary-preview": "Ð\9eпиÑ\81 Ð±Ñ\83де:",
-       "subject-preview": "Тема Ð±Ñ\83де:",
+       "summary-preview": "Ð\9fопеÑ\80еднÑ\96й Ð¿ÐµÑ\80еглÑ\8fд Ð¾Ð¿Ð¸Ñ\81Ñ\83 Ñ\80едагÑ\83ваннÑ\8f:",
+       "subject-preview": "Ð\9fопеÑ\80еднÑ\96й Ð¿ÐµÑ\80еглÑ\8fд Ñ\82еми:",
        "previewerrortext": "Сталася помилка при спробі попереднього перегляду Ваших змін.",
        "blockedtitle": "Користувача заблоковано",
        "blockedtext": "<strong>Ваш обліковий запис або IP-адреса заблоковані.</strong>\n\nБлокування виконане адміністратором $1.\nПричина блокування: <em>$2</em>.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Діапазон блокування: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністратору, якщо ви не зареєстровані або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.",
        "missing-revision": "Версія #$1 сторінки «{{FULLPAGENAME}}» не існує.\n\nІмовірно, Ви перейшли за застарілим посиланням на вилучену сторінку.\nПодробиці можна дізнатися з [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналу вилучень].",
        "userpage-userdoesnotexist": "Користувач під назвою \"<nowiki>$1</nowiki>\" не зареєстрований. Переконайтеся, що ви хочете створити/редагувати цю сторінку.",
        "userpage-userdoesnotexist-view": "Обліковий запис користувача «$1» не зареєстровано.",
-       "blocked-notice-logextract": "Цей користувач наразі заблокований.\nОстанній запис у журналі блокувань такий:",
+       "blocked-notice-logextract": "{{GENDER:$1|Цей користувач|Ця користувачка}} наразі {{GENDER:$1|заблокований|заблокована}}.\nОстанній запис у журналі блокувань такий:",
        "clearyourcache": "<strong>Увага:</strong> Після збереження слід очистити кеш оглядача, щоб побачити зміни.\n* <strong>Firefox / Safari:</strong> тримайте <em>Shift</em>, коли натискаєте <em>Оновити</em>, або натисніть <em>Ctrl-F5</em> чи <em>Ctrl-Shift-R</em> (<em>⌘-R</em> на Apple Mac)\n* <strong>Google Chrome:</strong> натисніть <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Apple Mac)\n* <strong>Internet Explorer:</strong> тримайте <em>Ctrl</em>, коли натискаєте <em>Оновити</em>, або натисніть <em>Ctrl-F5</em>\n* <strong>Opera:</strong> очистіть кеш за допомогою <em>Інструменти → Налаштування</em> (<em>Opera → Побажання</em> на Apple Mac) та перейдіть на <em>Приватність & безпека → очистити дані браузера → кеш</em>",
        "usercssyoucanpreview": "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий css-файл перед збереженням.",
        "userjsyoucanpreview": "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий код JavaScript перед збереженням.",
        "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": "усі",
        "saveprefs": "Зберегти",
        "restoreprefs": "Відновити всі стандартні налаштування (у всіх розділах)",
        "prefs-editing": "Редагування",
-       "rows": "Рядків:",
-       "columns": "Стовпців:",
        "searchresultshead": "Пошук",
        "stub-threshold": "Поріг для визначення оформлення посилань на стаби ($1):",
        "stub-threshold-sample-link": "зразок",
        "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": "Справжнє ім'я:",
        "editinguser": "Зміна прав {{GENDER:$1|користувача}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Перегляд прав {{GENDER:$1|користувача|користувачки}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Змінити групи {{GENDER:$1|користувача|користувачки}}",
-       "userrights-viewusergroup": "Перегляд груп користувача",
+       "userrights-viewusergroup": "Перегляд груп {{GENDER:$1|користувача|користувачки}}",
        "saveusergroups": "Зберегти групи {{GENDER:$1|користувачів}}",
        "userrights-groupsmember": "Член груп:",
        "userrights-groupsmember-auto": "Неявний член:",
-       "userrights-groups-help": "Ви можете змінити групи, до яких належить цей користувач:\n* Якщо біля назви групи стоїть позначка, то користувач належить до цієї групи.\n* Якщо позначка не стоїть — користувач не належить до відповідної групи.\n* Зірочка означає, що ви не можете вилучити користувача з групи, якщо додасте його до неї, і навпаки.",
+       "userrights-groups-help": "Ви можете змінити групи, до яких належить {{GENDER:$1|цей користувач|ця користувачка}}:\n* Якщо біля назви групи стоїть позначка, то {{GENDER:$1|користувач|користувачка}} належить до цієї групи.\n* Якщо позначка не стоїть — {{GENDER:$1|користувач|користувачка}} не належить до відповідної групи.\n* Зірочка «*» означає, що Ви не можете вилучити {{GENDER:$1|користувача|користувачку}} з групи, якщо додасте {{GENDER:$1|його|її}} до неї, і навпаки.\n* Решітка «#» означає, що Ви можете зменшити строк членства в групі, але не збільшити.",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "У вас нема дозволу змінювати права користувачів на інших вікі.",
        "userrights-nodatabase": "База даних $1 не існує або не є локальною.",
        "userrights-changeable-col": "Групи, які ви можете змінити",
        "userrights-unchangeable-col": "Групи, які ви не можете змінити",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "Закінчується $1",
+       "userrights-expiry-none": "Не має терміну дії",
+       "userrights-expiry": "Минає:",
+       "userrights-expiry-existing": "Поточний час закінчення: $3, $2",
+       "userrights-expiry-othertime": "Інший термін/строк:",
+       "userrights-expiry-options": "1 день:1 day,1 тиждень:1 week,1 місяць:1 month,3 місяці:3 months,6 місяців:6 months,1 рік:1 year",
+       "userrights-invalid-expiry": "Для групи «$1» задано неправильний час закінчення прав.",
+       "userrights-expiry-in-past": "Для групи «$1» задано минулий час закінчення прав.",
+       "userrights-cannot-shorten-expiry": "Ви не можете продовжити строк членства в групі «$1». Тільки користувачі з правом додавати і видаляти з групи мають право продовжувати членство.",
        "userrights-conflict": "Конфлікт зміни прав користувача! Будь ласка, перевірте та  підтвердіть зміни знову.",
        "group": "Група:",
        "group-user": "Користувачі",
        "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-feedbacklink": "Надайте відгук про нові (бета) фільтри",
+       "rcfilters-highlightbutton-title": "Виділити результати",
+       "rcfilters-highlightmenu-title": "Вибрати колір",
+       "rcfilters-highlightmenu-help": "Вибрати колір, щоб виділити цю властивість",
+       "rcfilters-filterlist-noresults": "Фільтри не знайдено",
+       "rcfilters-filtergroup-registration": "Реєстрація користувача",
+       "rcfilters-filter-registered-label": "Зареєстровані",
+       "rcfilters-filter-registered-description": "Користувачі, що увійшли в систему.",
+       "rcfilters-filter-unregistered-label": "Незареєстровані",
+       "rcfilters-filter-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».",
        "emailccsubject": "Копія вашого повідомлення до $1: $2",
        "emailsent": "Електронне повідомлення надіслано",
        "emailsenttext": "Ваше електронне повідомлення надіслано.",
-       "emailuserfooter": "Цей лист був надісланий {{GENDER:$2|користувачеві|користувачці}} $2 від {{GENDER:$1|користувача|користувачки}} $1 за допомогою функції «{{int:emailuser}}» проекту {{SITENAME}}. {{GENDER:$2|Ваш}} електронний лист потрапить безпосередньо до {{GENDER:$1|початковго відправника|початкової відправниці}}, відкривши {{GENDER:$1|йому|їй}} {{GENDER:$2|Вашу}} електронну адресу.",
+       "emailuserfooter": "Цей лист був надісланий {{GENDER:$2|користувачеві|користувачці}} $2 від {{GENDER:$1|користувача|користувачки}} $1 за допомогою функції «{{int:emailuser}}» проекту {{SITENAME}}. Якщо Ви відповісте на цей лист, Ваш електронний лист буде надіслано безпосередньо до {{GENDER:$1|початковго відправника|початкової відправниці}}, відкривши {{GENDER:$1|йому|їй}} {{GENDER:$2|Вашу}} електронну адресу.",
        "usermessage-summary": "Залишити системне повідомлення.",
        "usermessage-editor": "Системний вісник",
        "usermessage-template": "MediaWiki:UserMessage",
        "editcomment": "Пояснення редагування було: «<em>$1</em>.».",
        "revertpage": "Відкинуто редагування [[Special:Contributions/$2|$2]] ([[User talk:$2|обговорення]]) до зробленого [[User:$1|$1]]",
        "revertpage-nouser": "Відкинуто редагування прихованого користувача до останньої версії, зробленої {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Відкинуті редагування користувача $1; повернення до версії користувача $2.",
+       "rollback-success": "Відкинуті редагування {{GENDER:$3|користувача|користувачки}} $1; повернення до версії {{GENDER:$4|користувача|користувачки}} $2.",
        "rollback-success-notify": "Відкинуті редагування користувача $1; \nповернено до останньої версії користувача $2. [$3 Показати зміни]",
        "sessionfailure-title": "Помилка сеансу",
        "sessionfailure": "Здається, виникли проблеми з поточним сеансом роботи;\nця дія була скасована з метою попередити «захоплення сеансу».\nБудь ласка, натисніть кнопку «Назад» і перезавантажте сторінку, з якої ви прийшли.",
        "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": "Ви не можете блокувати чи розблоковувати інших користувачів, оскільки самі заблоковані",
        "svg-long-error": "неправильний SVG-файл: $1",
        "show-big-image": "Повна роздільність",
        "show-big-image-preview": "Розмір при попередньому перегляді: $1.",
-       "show-big-image-preview-differ": "Розмір цього $3-превью для вихідного $2-файлу: $1.",
+       "show-big-image-preview-differ": "Розмір цього попереднього перегляду $3 для вихідного $2-файлу: $1.",
        "show-big-image-other": "{{PLURAL:$2|1=Інша роздільність|Інші роздільності}}: $1.",
        "show-big-image-size": "$1 × $2 пікселів",
        "file-info-gif-looped": "кільцеве",
        "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": "Мітки",
        "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-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-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": "Відновлення сторінки",
        "usercssispublic": "Будь ласка, зверніть увагу: підсторінки CSS не повинні містити конфіденційних даних, бо їх можуть бачити інші користувачі.",
        "restrictionsfield-badip": "Недійсна IP-адреса або діапазон: $1",
        "restrictionsfield-label": "Дозволені діапазони IP-адрес:",
-       "restrictionsfield-help": "Одна IP-адреса або CIDR-діапазон на рядок. Щоб увімкнути все, використайте<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "restrictionsfield-help": "Одна IP-адреса або CIDR-діапазон на рядок. Щоб увімкнути все, використайте:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "версія $1",
        "pageid": "ID сторінки $1"
 }
index c688878..860697d 100644 (file)
        "saveprefs": "محفوظ",
        "restoreprefs": "تمام ابتدائی ترتیبات کو بحال کریں",
        "prefs-editing": "ترمیم کاری",
-       "rows": "صفیں:",
-       "columns": "قطاریں:",
        "searchresultshead": "تلاش",
        "stub-threshold": "نامکمل ربط کے فارمیٹ کی حد ($1):",
        "stub-threshold-sample-link": "نمونہ",
        "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 d4ff264..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",
        "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:",
        "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ả",
        "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ụ",
        "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ữ:",
        "userrights-user-editname": "Nhập tên thành viên:",
        "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-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.",
        "group": "Nhóm:",
        "group-user": "Thành viên thông thường",
        "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”.",
        "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",
        "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-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",
        "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>"
+       "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 51150e4..8093c68 100644 (file)
@@ -16,7 +16,8 @@
                        "Silovan",
                        "David1010",
                        "Macofe",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Otogi"
                ]
        },
        "tog-underline": "რცხუეფიშ ათოღაზუა:",
        "viewyourtext": "თქვა შეილებუნა ქოძირათ '''თქვანი რედაქტირაფეფიშ''' დაჭყაფური ტექსტი თე ხასჷლას დო გეჭოფათ თიშ ანგი.",
        "protectedinterface": "ეს გვერდი წარმოადგენს ტექსტურ ინტერფეისს პროგრამული უზრუნველყოფისათვის და დაცულია ვანდალიზმის აღკვეთის მიზნით.",
        "editinginterface": "<strong>ყურადღება:</strong> თქვენ არედაქტირებთ გვერდს, რომელიც პროგრამის ინტერფეისის ტექსტს შეიცავს. \nამ გვერდზე განხორციელებული რედაქტირება გამოიწვევს ამ ვიკის სხვა მომხმარებელთა სამუშაო ინტერფეისის შეცვლასაც.",
-       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკებისლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
+       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკების ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "ეს გვერდი რედაქტირებისგან დაცულია, რადგან იგი ჩართულია შემდეგ {{PLURAL:$1|გვერდში, რომლის |გვერდებში, რომელთა}} დასაცავადაც ჩართულია პარამეტრი \"იერარქიული\":\n$2",
        "namespaceprotected": "თქვენ არ გაქვთ '''$1''' სახელთა სივრცეში გვერდების რედაქტირების უფლება.",
        "customcssprotected": "თქვენ არ გაქვთ ამ CSS გვერდის რედაქტირების უფლება, ვინაიდან ის სხვა მომხმარებლის პირად კონფიგურაციას შეიცავს.",
        "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 91a3ad8..b4fd680 100644 (file)
        "searcharticle": "גיין",
        "history": "בלאט היסטאריע",
        "history_short": "היסטאָריע",
+       "history_small": "היסטאריע",
        "updatedmarker": "דערהיינטיגט זינט מיין לעצטע וויזיט",
        "printableversion": "דרוק ווערסיע",
        "permalink": "שטענדיגער לינק",
        "createacct-email-ph": "קלאַפט ארײַן אײַער בליצפּאָסט אַדרעס",
        "createacct-another-email-ph": "אַרײַנגעבן בליצפּאָסט אַדרעס",
        "createaccountmail": "ניצן א פראוויזאריש פאסווארט און שיקן צום געצייכנטן ע-פאסט אדרעס",
+       "createaccountmail-help": "קען ווערן באניצט צו שאפֿן קאנטע פֿאר א צווייטן אן צו דערגיין דאס פאסווארט.",
        "createacct-realname": "עכטער נאמען (אפציאנאל)",
        "createaccountreason": "אורזאַך:",
        "createacct-reason": "אורזאך",
        "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>.",
        "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": "שפּראַך:",
        "userrights-user-editname": "לייגט אריין א באַניצער-נאמען:",
        "editusergroup": "לאדן באַניצער גרופּעס",
        "editinguser": "ענדערן באַניצער רעכטן פון  {{GENDER:$1|באַניצער|באַניצערין}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "רעדאַקטירן באַניצער גרופעס",
-       "userrights-viewusergroup": "באַקוקן באַניצער גרופעס",
+       "userrights-editusergroup": "רעדאַקטירן {{GENDER:$1|באַניצער|באַניצערין}} גרופעס",
+       "userrights-viewusergroup": "באַקוקן {{GENDER:$1|באַניצער|באַניצערין}} גרופעס",
        "saveusergroups": "אויפֿהיטן {{GENDER:$1|באַניצער}} גרופעס",
        "userrights-groupsmember": "מיטגליד פון:",
        "userrights-groupsmember-auto": "אויטאמטישער מיטגליד פֿון:",
-       "userrights-groups-help": "איר מעגט ענדערן די גרופעס צו וועמען דער באַניצער געהערט:\n*א מאַרקירט קעסטל באַדײַט אָז דער באַניצער איז א מיטגליד אין דער גרופע.\n* אַן אוממאַרקירט קעסטל באַדײַט אָז דער באַניצער איז נישט קיין מיטגליד אין דער גרופע.\n* א * ווײַזט אַז איר קענט נישט אַראפנעמען די גרופע נאָך דעם וואָט איר האט זי צוגעלייגט, אדער פֿאַרקערט.",
+       "userrights-groups-help": "איר מעגט ענדערן די גרופעס צו וועמען {{GENDER:$1|דער באַניצער|די באַניצערין}} געהערט:\n*א מאַרקירט קעסטל באַדײַט אָז דער באַניצער איז א מיטגליד אין דער גרופע.\n* אַן אוממאַרקירט קעסטל באַדײַט אָז דער באַניצער איז נישט קיין מיטגליד אין דער גרופע.\n* א * ווײַזט אַז איר קענט נישט אַראפנעמען די גרופע נאָך דעם וואָט איר האט זי צוגעלייגט, אדער פֿאַרקערט.",
        "userrights-reason": "אורזאַך:",
        "userrights-no-interwiki": "איר האט נישט קיין ערלויבניש צו רעדאַקטירן באַניצער רעכטן אויף אַנדערע וויקיס.",
        "userrights-nodatabase": "דאַטנבאַזע $1 אדער עקזיסטירט נישט אדער איז נישט ארטיק.",
        "userrights-changeable-col": "גרופעס איר קענט ענדערן",
        "userrights-unchangeable-col": "גרופעס איר קענט נישט ענדערן",
+       "userrights-expiry-current": "לאזט אויס $1",
+       "userrights-expiry-none": "לאזט נישט אויס",
+       "userrights-expiry": "גייט אויס:",
+       "userrights-expiry-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": "קאנפֿליקט פון באניצער־רעכטן ענדערונגען! זייט אזוי גוט רעצענזירן און באשטעטיקן אײַערע ענדערונגען.",
        "group": "גרופע:",
        "group-user": "באניצערס",
        "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": "מקור טעקע",
        "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}}. {{GENDER:$2|אייער}} ע־פאסט וועט מען שיקן גראד be sent directly to the {{GENDER:$1|צום אריגינעלן אפשיקער|צו דער אריגינעלער אפשיקערין}}, וואס וועט אויפדעקן {{GENDER:$2|אייער}} ע־פאסט אדרעס צו {{GENDER:$1|אים|איר}}.",
+       "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:באניצער־מעלדונג",
        "feedback-thanks": "ייש\"כ! אײַער פֿידבעק איז געווארן ארויפגעלעגט צום בלאט \"[$2 $1]\".",
        "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| אַן אַנדער טעקע | [$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 b021371..19f211a 100644 (file)
@@ -30,7 +30,8 @@
                        "Jdforrester",
                        "Tungakl",
                        "Suzukaze-c",
-                       "Asdfugil"
+                       "Asdfugil",
+                       "Deryck Chan"
                ]
        },
        "tog-underline": "連結加底線:",
@@ -48,6 +49,7 @@
        "tog-watchdefault": "將我修改嘅頁同檔案加入監視清單",
        "tog-watchmoves": "將我移動嘅頁同檔案加入監視清單",
        "tog-watchdeletion": "將我刪除嘅頁同檔案加入監視清單",
+       "tog-watchuploads": "將我上載嘅檔案加入監視清單",
        "tog-watchrollback": "將我反轉過嘅頁加落監視清單",
        "tog-minordefault": "預設全部編輯做小修改",
        "tog-previewontop": "喺修改欄上邊顯示預覽",
@@ -71,7 +73,7 @@
        "tog-ccmeonemails": "喺我寄電郵畀其他人嗰陣,寄返封副本畀我。",
        "tog-diffonly": "響差異下面唔顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏類",
-       "tog-norollbackdiff": "進行反轉之後略過差異",
+       "tog-norollbackdiff": "進行反轉之後唔睇差異",
        "tog-useeditwarning": "當我離開未保存好嘅修改嗰陣警告我",
        "tog-prefershttps": "簽到後繼續用加密連線",
        "underline-always": "全部",
        "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": "而家簽走唔到",
+       "cannotlogoutnow-text": "用緊$1嗰陣唔可以簽走。",
        "welcomeuser": "歡迎,$1!",
        "welcomecreation-msg": "你個戶口已經起好。\n唔好唔記得去改改你嘅{{SITENAME}}[[Special:Preferences|喜好設定]]喎。",
        "yourname": "用戶名:",
        "cannotlogin-title": "簽到唔到",
        "cannotlogin-text": "冇可能簽到",
        "cannotloginnow-title": "而家簽到唔到",
+       "cannotloginnow-text": "用緊$1嗰陣唔可以簽到。",
+       "cannotcreateaccount-title": "開唔到新戶口",
+       "cannotcreateaccount-text": "呢個維基唔准直接開戶",
        "yourdomainname": "你嘅網域:",
        "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|版|版}}",
        "createacct-benefit-body3": "最近{{PLURAL:$1|貢獻者|貢獻者}}",
-       "badretype": "ä½ å\85¥å\98\85å¯\86碼å\94\94ä¸\80è\87´。",
+       "badretype": "ä½ å\85¥å\98\85å¯\86碼å\89\8då¾\8cä¸\8dä¸\80。",
        "usernameinprogress": "呢個名嘅戶口已經開緊。\n請等等。",
        "userexists": "你入嘅用戶名已經有人用咗。\n唔該揀過個名啦。",
        "loginerror": "登入錯誤",
        "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": "取消",
        "minoredit": "呢個係小修改",
        "watchthis": "睇實呢一頁",
        "savearticle": "儲存呢頁",
+       "savechanges": "記好",
        "publishpage": "發佈呢頁",
        "publishchanges": "發佈修改",
        "preview": "預覽",
        "saveprefs": "儲存",
        "restoreprefs": "恢復全部預設設定(喺所有項目)",
        "prefs-editing": "編輯中",
-       "rows": "行數:",
-       "columns": "列數:",
        "searchresultshead": "搵嘢",
        "stub-threshold": "楔位連結格式門檻 ($1):",
        "stub-threshold-sample-link": "樣辦",
        "editusergroup": "編輯用戶組",
        "editinguser": "改緊<strong>[[User:$1|$1]]</strong>嘅用戶權限 $2",
        "userrights-editusergroup": "編輯用戶組",
-       "saveusergroups": "儲存用戶組",
+       "saveusergroups": "儲存{{GENDER:$1|用戶}}組",
        "userrights-groupsmember": "屬於:",
        "userrights-groupsmember-auto": "固有屬於:",
-       "userrights-groups-help": "你可以改呢位用戶所屬嘅組:\n* 剔咗嘅盒代表個用戶係屬於嗰組。\n* 未剔嘅盒代表個用戶唔係屬於嗰組。\n* 一個 * 表示你加入咗佢之後唔可以拎走,反之亦然。",
+       "userrights-groups-help": "你可以改呢位用戶所屬嘅組:\n* 剔咗嘅盒代表個用戶係屬於嗰組。\n* 未剔嘅盒代表個用戶唔係屬於嗰組。\n* 一個 * 表示你加入咗佢之後唔可以拎走,反之亦然。\n* 一個 # 表示你只可以推遲嗰組嘅失效日期,唔可以提早。",
        "userrights-reason": "原因:",
        "userrights-no-interwiki": "你並無權限去編輯響其它wiki嘅用戶權限。",
        "userrights-nodatabase": "資料庫$1唔存在或者唔係本地嘅。",
        "userrights-changeable-col": "你可以改嘅組",
        "userrights-unchangeable-col": "你唔可以改嘅組",
+       "userrights-expiry-current": "$1 到期",
+       "userrights-expiry-none": "唔會到期",
+       "userrights-expiry": "到期:",
+       "userrights-expiry-existing": "現時到期嘅時間: $2 $3",
+       "userrights-expiry-othertime": "其它時間:",
        "userrights-conflict": "用戶權限更改有衝突!請再睇過同確認你嘅改動。",
        "group": "組:",
        "group-user": "用戶",
        "rightslogtext": "呢個係用戶權力嘅修改日誌。",
        "action-read": "讀呢版",
        "action-edit": "編輯呢版",
-       "action-createpage": "開版",
+       "action-createpage": "建立呢頁",
        "action-createtalk": "開討論版",
        "action-createaccount": "開呢個用戶戶口",
        "action-history": "睇呢頁嘅歷史",
        "action-suppressionlog": "睇呢個私有日誌",
        "action-block": "封鎖呢位用戶嘅編輯",
        "action-protect": "改呢版嘅保護等級",
+       "action-rollback": "速還原某版最後修改人之修改",
        "action-import": "由其它wiki度倒入版",
        "action-importupload": "由檔案上載度倒入版",
        "action-patrol": "標示其它嘅編輯做已巡查嘅",
        "action-userrights": "編輯全部嘅權限",
        "action-userrights-interwiki": "編輯響其它wiki用戶嘅權限",
        "action-siteadmin": "鎖同解鎖資料庫",
-       "action-sendemail": "電郵",
+       "action-sendemail": "電郵",
        "action-editmywatchlist": "改監視清單",
        "action-viewmywatchlist": "睇監視清單",
        "action-viewmyprivateinfo": "睇你嘅私人資料",
        "recentchanges-legend-heading": "<strong>標記:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (睇埋[[Special:NewPages|新開版]])",
        "recentchanges-submit": "顯示",
+       "rcfilters-filter-editsbyself-description": "你改嘅嘢。",
+       "rcfilters-filter-editsbyother-label": "其他人改嘅嘢",
+       "rcfilters-filter-editsbyother-description": "其他人(唔係你)改嘅嘢",
+       "rcfilters-filtergroup-userExpLevel": "經驗級別(只限簽咗到嘅用戶)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "新手",
+       "rcfilters-filter-userExpLevel-newcomer-description": "少過4日、10次編輯",
+       "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": "修改類別",
        "rcnotefrom": "下面嘅{{PLURAL:$5|改動}}由 <strong>$3 $4</strong> 開始(顯示到'''$1''')。",
        "rclistfrom": "顯示由$3 $2嘅新更改",
        "rcshowhideminor": "$1小編輯",
        "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檔案係禁止左嘅。",
        "allpagesbadtitle": "提供嘅頁面名無效,又或者有一個跨語言或跨wiki嘅字頭。佢可能包括一個或多個字係唔可以用響標題度嘅。",
        "allpages-bad-ns": "{{SITENAME}}係無一個空間名叫做\"$1\"。",
        "allpages-hide-redirects": "收埋跳轉",
+       "cachedspecial-viewing-cached-ttl": "以下資料,來自暫存,上次更新係$1之前嘅事。",
        "cachedspecial-refresh-now": "睇最新。",
        "categories": "類",
        "categoriespagetext": "下面嘅{{PLURAL:$1|類}}有版或媒體。\n[[Special:UnusedCategories|未用類]]唔會響呢度列示。\n請同時參閱[[Special:WantedCategories|需要嘅分類]]。",
        "delete-legend": "刪除",
        "historywarning": "<strong>警告:</strong>你要刪除嘅頁面有大約$1次嘅修訂:",
        "confirmdeletetext": "你準備刪除一個頁面或者圖像,包括佢嘅所有歷史版本。\n請確認你打算噉做,而且你知道後果係點,加上確認你噉做冇違反到[[{{MediaWiki:Policy-url}}]]。",
-       "actioncomplete": "æ\93\8dä½\9cå®\8cæ\88\90",
-       "actionfailed": "æ\93\8dä½\9c失æ\95\97",
+       "actioncomplete": "æ\90\9eæ\8e\82",
+       "actionfailed": "æ\90\9eå\94\94æ\8e\82",
        "deletedtext": "\"$1\"已經刪除。最近嘅刪除記錄請睇$2。",
        "dellogpage": "刪除日誌",
        "dellogpagetext": "以下係最近嘅刪除清單。",
        "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 e305099..b1227d2 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": "固定链接",
        "resettokens": "重置密钥",
        "resettokens-text": "您可以在这里重置允许访问与您的账户有关的特定私人数据的密钥。\n\n如果您意外将它们分享给他人,或是您的账户已经被入侵,您应该重置它们。",
        "resettokens-no-tokens": "没有可以重置的密钥。",
-       "resettokens-tokens": "密钥:",
+       "resettokens-tokens": "令牌:",
        "resettokens-token-label": "$1(当前值:$2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|对你的监视列表中的页面的更改]]的网页feed(Atom/RSS)的密钥",
        "resettokens-done": "密钥已重置。",
        "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。请在您做出的任何查询中包含所有上述详情。",
        "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": "您的文字",
        "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": "界面语言:",
        "badsig": "错误的原始签名。请检查HTML标签。",
        "badsiglength": "签名过长。请不超过$1个字符。",
        "yourgender": "您希望使用什么性别称呼?",
-       "gender-unknown": "当提及您时,软件将使用性别中性的词汇(只要可能)",
+       "gender-unknown": "当提及您时,软件将尽可能使用性别中性的词法",
        "gender-male": "他",
        "gender-female": "她",
        "prefs-help-gender": "该设置为可选项。软件根据该值在称呼您及对他人提及您时使用适当的语法性别。该信息会被公开。",
        "prefs-advancedwatchlist": "高级选项",
        "prefs-displayrc": "显示",
        "prefs-displaywatchlist": "显示",
-       "prefs-tokenwatchlist": "密钥",
+       "prefs-tokenwatchlist": "令牌",
        "prefs-diffs": "差异对比",
        "prefs-help-prefershttps": "该设置将在下次登录时生效。",
        "prefswarning-warning": "您对您的参数设置的更改尚未保存。如果您不点击“$1”就离开,您的设置就不会更新。",
        "editusergroup": "加载用户组",
        "editinguser": "更改{{GENDER:$1|用户}}<strong>[[User:$1|$1]]</strong>的用户权限$2",
        "viewinguserrights": "查看{{GENDER:$1|用户}}<strong>[[User:$1|$1]]</strong>的用户权限$2",
-       "userrights-editusergroup": "编辑用户组",
-       "userrights-viewusergroup": "查看用户组",
+       "userrights-editusergroup": "编辑{{GENDER:$1|用户}}组",
+       "userrights-viewusergroup": "查看{{GENDER:$1|用户}}组",
        "saveusergroups": "保存{{GENDER:$1|用户}}组",
        "userrights-groupsmember": "用户组:",
        "userrights-groupsmember-auto": "自动用户组:",
-       "userrights-groups-help": "æ\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-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": "用户权限的更改存在冲突!请检查并确认您的更改。",
        "group": "用户组:",
        "group-user": "用户",
        "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-feedbacklink": "在新(测试版)过滤器中提供反馈",
+       "rcfilters-highlightbutton-title": "高亮结果",
+       "rcfilters-highlightmenu-title": "选择颜色",
+       "rcfilters-highlightmenu-help": "选择颜色来高亮该属性",
        "rcfilters-filterlist-noresults": "找不到过滤器",
-       "rcfilters-filtergroup-authorship": "编辑作者",
+       "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小编辑",
        "recentchangeslinked-feed": "相关更改",
        "recentchangeslinked-toolbox": "相关更改",
        "recentchangeslinked-title": "与“$1”有关的更改",
-       "recentchangeslinked-summary": "这是链接自指定页面(或至指定分类的成员)的页面的最近更改的列表。[[Special:Watchlist|的监视列表]]中的页面以<strong>粗体</strong>显示。",
+       "recentchangeslinked-summary": "这是链接自指定页面(或至指定分类的成员)的页面的最近更改的列表。[[Special:Watchlist|的监视列表]]中的页面以<strong>粗体</strong>显示。",
        "recentchangeslinked-page": "页面名称:",
        "recentchangeslinked-to": "显示链到所给出的页面",
        "recentchanges-page-added-to-category": "[[:$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": "提交",
        "uncategorizedcategories": "未归类分类",
        "uncategorizedimages": "未归类文件",
        "uncategorizedtemplates": "未归类模板",
+       "uncategorized-categories-exceptionlist": " #包含分类列表,它不能在Special:UncategorizedCategories中被提及。每行一条,以“*”开头。其他字符开头的行(包括空格)将被忽略。使用“#”作为注释。",
        "unusedcategories": "未使用分类",
        "unusedimages": "未使用文件",
        "wantedcategories": "需要的分类",
        "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-params-json": "JSON参数:",
+       "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-namespaces": "$1(所有名字空间)",
        "apisandbox-multivalue-all-values": "$1(所有值)",
        "booksources": "网络书源",
        "booksources-search-legend": "搜索图书来源",
        "emailccsubject": "您发送给$1的消息的副本:$2",
        "emailsent": "电子邮件已发送",
        "emailsenttext": "您的电子邮件已经发出。",
-       "emailuserfooter": "本电子邮件是通过{{SITENAME}}的“{{int:emailuser}}”功能被$1{{GENDER:$1|发送}}至{{GENDER:$2|$2}}的。{{GENDER:$2|您}}的电子邮件将直接发送至{{GENDER:$1|原始发送者}},并向{{GENDER:$1|其}}显示{{GENDER:$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": "监视列表",
        "editcomment": "编辑摘要:<em>$1</em>。",
        "revertpage": "恢复[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的编辑至[[User:$1|$1]]的最后版本",
        "revertpage-nouser": "恢复隐藏用户的编辑至{{GENDER:$1|[[User:$1|$1]]}}的最后版本",
-       "rollback-success": "已恢复$1的编辑,更改回$2的最后版本。",
+       "rollback-success": "已恢复{{GENDER:$3|$1}}的编辑;更改回{{GENDER:$4|$2}}的最后版本。",
        "rollback-success-notify": "已回退$1的编辑,更改回$2的最后版本。[$3 显示更改]",
        "sessionfailure-title": "会话无效",
        "sessionfailure": "似乎您的登录会话有问题;\n为了防止会话劫持,这个操作已经被取消。\n请返回先前的页面,重新载入该页面,然后重试。",
        "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": "阻止用户发送电子邮件",
        "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": "您无法封禁或解封其他用户,因为您自己已被封禁",
        "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”未导入,因为您不被允许创建它。",
        "tooltip-pt-mytalk": "{{GENDER:|您}}的讨论页面",
        "tooltip-pt-anontalk": "有关本IP地址的编辑的讨论",
        "tooltip-pt-preferences": "{{GENDER:|您}}的设置",
-       "tooltip-pt-watchlist": "正在监视更改的页面的列表",
+       "tooltip-pt-watchlist": "正在监视更改的页面的列表",
        "tooltip-pt-mycontris": "{{GENDER:|您}}的贡献的列表",
        "tooltip-pt-anoncontribs": "来自此IP地址的编辑列表",
        "tooltip-pt-login": "我们鼓励您登录;然而,这不是强制性的",
        "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-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",
        "confirm-rollback-button": "确定",
        "confirm-rollback-top": "回退此页面的编辑么?",
        "semicolon-separator": ";",
-       "comma-separator": "",
+       "comma-separator": "",
        "colon-separator": ":",
        "pipe-separator": "&#32;|&#32;",
        "word-separator": "",
        "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-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|另一个文件|另一些文件}},但{{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-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。",
        "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的会话",
        "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>",
+       "restrictionsfield-help": "每行一个IP地址或CIDR段。要启用任何地址或地址段,可使用:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "修订版本$1",
        "pageid": "页面ID$1"
 }
index e8806c3..ac9b60e 100644 (file)
                        "Wehwei",
                        "1233thehongkonger",
                        "Maskers",
-                       "Knch903"
+                       "Knch903",
+                       "Winstonyin",
+                       "Wmr",
+                       "烈羽",
+                       "和平奮鬥救地球"
                ]
        },
        "tog-underline": "底線標示連結:",
        "searcharticle": "執行",
        "history": "頁面歷史",
        "history_short": "歷史",
-       "updatedmarker": "自我上次造訪後的更新",
+       "history_small": "歷史",
+       "updatedmarker": "自我上次瀏覽之後的更新",
        "printableversion": "可列印版",
        "permalink": "靜態連結",
        "print": "列印",
        "talk": "討論",
        "views": "檢視",
        "toolbox": "工具",
-       "tool-link-userrights": "更改{{GENDER:$1|使用者}}群組",
+       "tool-link-userrights": "變更{{GENDER:$1|使用者}}群組",
        "tool-link-userrights-readonly": "檢視{{GENDER:$1|使用者}}群組",
        "tool-link-emailuser": "寄信給這位{{GENDER:$1|使用者}}",
        "userpage": "檢視使用者頁面",
        "selfredirect": "<strong>警告:</strong> 您正建立連結至自己的重新導向。\n您可能指定錯要重新導向的目標頁面或者編輯錯頁面。\n若您再點選 \"{{int:savearticle}}\" 一次,將會繼續建立重新導向。",
        "missingcommenttext": "請在下方輸入評論。",
        "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨。\n若您再點選 \"{{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}}|管理員]] 討論封鎖的相關問題。\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|偏好設定]] 設定並驗證您的電子郵件地址。",
        "newarticle": "(新)",
        "newarticletext": "您正連結至一頁不存在頁面。\n要建立該頁面,請在下方的編輯方塊中輸入內容 (詳情請參考 [$1 使用說明頁面]) 。\n如果您是不小心來到此頁面,請點選瀏覽器的 <strong>返回</strong> 按鈕。",
        "anontalkpagetext": "----\n<em>此討論頁面是給尚未建立帳號的匿名使用者使用</em>\n因此我們必須使用 IP 位址來辨識身份,但相同的 IP 位址可能由許多不同的使用者所共用。\n如果您是匿名使用者並且覺得評論的內容與您無關,請 [[Special:CreateAccount|建立新帳號]] 或 [[Special:UserLogin|登入]] 避免與其他匿名使用者混淆。",
-       "noarticletext": "此頁面目前沒有內容,您可以在其它頁面中[[Special:Search/{{PAGENAME}}|搜尋此頁面標題]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 建立此頁]</span>。",
+       "noarticletext": "此頁面目前沒有內容,您可以在其它頁面中[[Special:Search/{{PAGENAME}}|搜尋此頁面標題]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 建立此頁]</span>。",
        "noarticletext-nopermission": "此頁面目前沒有內容,\n您可以在其它頁面中 [[Special:Search/{{PAGENAME}}|搜尋此頁面標題]],或 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]</span>,但您沒有權限建立此頁面。",
        "missing-revision": "頁面名稱 \"{{FULLPAGENAME}}\" 的 #$1 修訂版本不存在。\n\n通常是因連結到過期的歷史頁面,該頁面已被刪除。\n詳情請參考 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
        "userpage-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。\n若您要建立/編輯此頁面,請先檢查是否正確。",
        "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": "樣本",
        "userrights": "使用者權限管理",
        "userrights-lookup-user": "選擇用戶",
        "userrights-user-editname": "請輸入使用者名稱:",
-       "editusergroup": "加載用戶組",
+       "editusergroup": "載入使用者群組",
        "editinguser": "變更{{GENDER:$1|使用者}} <strong>[[User:$1|$1]]</strong> 的使用者權限 $2",
-       "userrights-editusergroup": "編輯使用者群組",
-       "userrights-viewusergroup": "檢視使用者群組",
+       "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-nodatabase": "資料庫 $1 不存在或不在本地主機的。",
        "userrights-changeable-col": "您可變更的群組",
        "userrights-unchangeable-col": "您不可變更的群組",
+       "userrights-expiry": "期限:",
+       "userrights-expiry-othertime": "其他時間:",
        "userrights-conflict": "使用者權限變更發生衝突!請檢閱並確認你的變更。",
        "group": "群組:",
        "group-user": "使用者",
        "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-feedbacklink": "在新(測試版)過濾器中提供反饋",
+       "rcfilters-highlightmenu-title": "選擇顏色",
+       "rcfilters-filterlist-noresults": "找不到過濾規則",
+       "rcfilters-filter-registered-label": "已註冊",
+       "rcfilters-filter-unregistered-label": "未註冊",
+       "rcfilters-filtergroup-authorship": "編輯者",
+       "rcfilters-filter-editsbyself-label": "您自己的編輯",
+       "rcfilters-filter-editsbyself-description": "您的編輯。",
+       "rcfilters-filter-editsbyother-label": "其他人的編輯",
+       "rcfilters-filter-editsbyother-description": "由其他使用者而非您所作的編輯。",
+       "rcfilters-filtergroup-userExpLevel": "經驗等級 (僅限已註冊的使用者)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "新手",
+       "rcfilters-filter-userExpLevel-newcomer-description": "編輯數低於 10 次,活躍低於 4 天。",
+       "rcfilters-filter-userExpLevel-learner-label": "初學者",
+       "rcfilters-filter-userExpLevel-learner-description": "活躍的天數以及編輯數比「新手」多,但比「有經驗的使用者」少。",
+       "rcfilters-filter-userExpLevel-experienced-label": "有經驗的使用者",
+       "rcfilters-filter-userExpLevel-experienced-description": "活躍超過 30 天,編輯超過 500 次。",
+       "rcfilters-filter-bots-label": "機器人",
+       "rcfilters-filter-humans-label": "人類(非機器人)",
+       "rcfilters-filter-humans-description": "由人類編者做出的編輯",
+       "rcfilters-filter-minor-label": "小修改",
+       "rcfilters-filter-major-label": "非小編輯",
+       "rcfilters-filter-major-description": "未標記小修改的編輯。",
+       "rcfilters-filter-pageedits-label": "頁面編輯",
+       "rcfilters-filter-newpages-label": "頁面創建",
+       "rcfilters-filter-newpages-description": "創立新頁面的編緝。",
+       "rcfilters-filter-categorization-label": "分類變更",
        "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 檔案。",
        "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-values": "$1(所有值)",
+       "apisandbox-multivalue-all-namespaces": "$1 (所有命名空間)",
+       "apisandbox-multivalue-all-values": "$1 (所有值)",
        "booksources": "圖書資源",
        "booksources-search-legend": "尋找圖書資源",
        "booksources-isbn": "國際標準書號:",
        "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": "監視清單",
        "editcomment": "編輯摘要為:<em>$1</em>。",
        "revertpage": "已還原 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 的編輯為最後由 [[User:$1|$1]] 所修訂的版本",
        "revertpage-nouser": "已還隱藏使用者的編輯為最後 {{GENDER:$1|[[User:$1|$1]]}} 修訂的版本",
-       "rollback-success": "已還原 $1 所做的編輯;\n變更回由 $2 修訂的最後一個版本。",
+       "rollback-success": "已還原 {{GENDER:$3|$1}} 所做的編輯;\n變更回由 {{GENDER:$4|$2}} 修訂的最後一個版本。",
        "rollback-success-notify": "已還原 $1 所做的編輯;\n變更回由 $2 修訂的最後一個版本。[$3 顯示變更]",
        "sessionfailure-title": "連線階段失敗",
        "sessionfailure": "您的登入連線階段似乎有問題,\n為了預防連線階段受到劫持攻擊,此動作已經被取消。\n請返回上一頁,重新讀取該頁面再試一次。",
        "changecontentmodel-emptymodels-title": "沒有內容模型可用",
        "changecontentmodel-emptymodels-text": "[[:$1]]上的內容不能轉換為任何類型。",
        "log-name-contentmodel": "內容模型變更日誌",
-       "log-description-contentmodel": "與頁面內容模型相關的事件",
+       "log-description-contentmodel": "此頁列舉頁面內容模型的變更記錄以及使用非預設的內容模型所創建的頁面。",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|已使用}}非預設的內容模型 \"$5\" 建立頁面 $3",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|已變更}}頁面 $3 的內容模型自 \"$4\" 至 \"$5\"",
        "logentry-contentmodel-change-revertlink": "還原",
        "proxyblockreason": "因您的 IP 位址是開放代理伺服器,已被封鎖。\n請聯絡您的網路服務供應商或您所在組織的技術支援,告知他們此嚴重的安全性問題。",
        "sorbsreason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。",
        "sorbs_create_account_reason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。\n您不能建立帳號。",
+       "softblockrangesreason": "您的IP位址($1)不允許匿名貢獻,請登入。",
        "xffblockreason": "您的 IP 位址使用 X-Forwarded-For 標頭,您或您使用的代理伺服器已被封鎖。\n封鎖的原因為:$1",
        "cant-see-hidden-user": "您欲封鎖的使用者已經被封鎖並且隱藏。\n您沒有隱藏使用者的權限,您無法檢視或編輯該使用者的封鎖狀態。",
        "ipbblocked": "因您已被封鎖,故無法封鎖或解除封鎖其他使用者。",
        "cant-move-to-user-page": "您沒有權限移動頁面至使用者頁面 (除使用者子頁面外)。",
        "cant-move-category-page": "您沒有權限移動分類頁面。",
        "cant-move-to-category-page": "您沒有權限移動頁面至分類頁面。",
+       "cant-move-subpages": "您沒有權限移動子頁面。",
+       "namespace-nosubpages": "名字空間「$1」不允許有子頁面。",
        "newtitle": "新標題:",
        "move-watch": "監視來源以及目標頁面",
        "movepagebtn": "移動頁面",
        "pageinfo-length": "頁面長度 (位元組)",
        "pageinfo-article-id": "頁面 ID",
        "pageinfo-language": "頁面內容語言",
+       "pageinfo-language-change": "變更",
        "pageinfo-content-model": "頁面內容模型",
        "pageinfo-content-model-change": "變更",
        "pageinfo-robot-policy": "由機器人建立索引",
        "variantname-gan-hans": "‪中文(简体)",
        "variantname-gan-hant": "‪中文(繁體)",
        "metadata": "詮釋資料",
-       "metadata-help": "æ­¤æª\94æ¡\88å\8c\85å\90«é¡\8då¤\96ç\9a\84è³\87è¨\8aï¼\8cå\8f¯è\83½ç\94±æ\95¸ä½\8dç\9b¸æ©\9fæ\88\96æ\8e\83æ\8f\8fæ©\9fæ\89\80建ç«\8bç\9a\84ã\80\82\nè\8b¥ä¿®æ\94¹æ­¤æª\94æ¡\88ï¼\8cé\83¨ä»½è³\87è¨\8aå°\87ç\84¡æ³\95ä¿\9dç\95\99。",
+       "metadata-help": "æ­¤æ\96\87件中å\8c\85å\90«é¡\8då¤\96ä¿¡æ\81¯ã\80\82é\80\99äº\9bä¿¡æ\81¯å\8f¯è\83½æ\98¯ç\94±æ\95¸ç¢¼ç\9b¸æ©\9fæ\88\96æ\8e\83æ\8f\8få\84\80å\9c¨å\89µå»ºæ\88\96æ\95¸å­\97å\8c\96é\81\8eç¨\8b中æ\89\80æ·»å\8a ç\9a\84ã\80\82å¦\82æ\9e\9cæ\96\87件è\87ªå\88\9då§\8bç\8b\80æ\85\8bå·²å\8f\97å\88°ä¿®æ\94¹ï¼\8cä¸\80äº\9b詳細說æ\98\8eå\8f¯è\83½ç\84¡æ³\95å\8f\8dæ\98 ä¿®æ\94¹å¾\8cç\9a\84æ\96\87件。",
        "metadata-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",
        "confirm-rollback-button": "確定",
        "confirm-rollback-top": "還原編輯到此頁面?",
        "semicolon-separator": ";",
-       "comma-separator": "",
+       "comma-separator": "",
        "colon-separator": ":",
        "word-separator": "",
        "parentheses": " ($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": "加入分類...",
+       "mw-widgets-usersmultiselect-placeholder": "添加更多...",
        "sessionmanager-tie": "無法合併多個請求認証類型:$1。",
        "sessionprovider-generic": "$1 連線階段",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "以 cookie 為基礎的連線階段",
        "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": "修訂刪除",
        "authmanager-authn-no-local-user": "提供的憑證沒有與任何在此 wiki 上的使用者相關聯。",
        "authmanager-authn-no-local-user-link": "提供的憑證有效但沒有與任何在此 wiki 上的使用者相關聯。請採用其他方式登入,或建立新使用者,您將會有選項可以連結您先前的憑證到新帳號。",
        "authmanager-authn-autocreate-failed": "自動建立本地帳號失敗:$1",
-       "authmanager-change-not-supported": "提供的證無法變更,因為尚無法使用。",
+       "authmanager-change-not-supported": "提供的證無法變更,因為尚無法使用。",
        "authmanager-create-disabled": "已關閉帳號自動建立。",
        "authmanager-create-from-login": "要建立您的帳號,請先填寫此欄位。",
        "authmanager-create-not-in-progress": "帳號建立尚未進行或連線階段資料已遺失,請重頭再開始。",
        "authpage-cannot-link-continue": "無法繼續帳號連結,您的連線階段似乎已逾時。",
        "cannotauth-not-allowed-title": "權限不足",
        "cannotauth-not-allowed": "您不被允許使用此頁面",
-       "changecredentials": "更改憑證",
-       "changecredentials-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>"
+       "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..8a43998 100644 (file)
@@ -317,7 +317,7 @@ $magicWords = [
        'pagesincategory_files'     => [ '0', 'فايلات', 'ملفات', 'files' ],
 ];
 
-// (bug 16469) Override Eastern Arabic numberals, use Western
+// (T18469) Override Eastern Arabic numberals, use Western
 $digitTransformTable = [
        '0' => '0',
        '1' => '1',
@@ -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 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..94b0a34 100644 (file)
@@ -106,10 +106,10 @@ $specialPageAliases = [
        'Mostlinkedtemplates'       => [ 'Nejpoužívanější_šablony', 'Nejpouzivanejsi_sablony' ],
        'Mostrevisions'             => [ 'Stránky_s_nejvíce_editacemi', 'Stranky_s_nejvice_editacemi', 'Stránky_s_nejvyšším_počtem_editací' ],
        'Movepage'                  => [ 'Přesunout_stránku', 'Přejmenovat_stránku' ],
-       'Mycontributions'           => [ 'Mé_příspěvky', 'Me_prispevky' ],
+       'Mycontributions'           => [ 'Moje_příspěvky', 'Mé_příspěvky', 'Me_prispevky' ],
        'MyLanguage'                => [ 'V_mém_jazyce', 'Můj_jazyk' ],
-       'Mypage'                    => [ 'Moje_stránka', 'Moje_stranka' ],
-       'Mytalk'                    => [ 'Moje_diskuse' ],
+       'Mypage'                    => [ 'Moje_stránka', 'Moje_stranka', 'Má_stránka' ],
+       'Mytalk'                    => [ 'Moje_diskuse', 'Má_diskuse' ],
        'Myuploads'                 => [ 'Moje_soubory', 'Mé_soubory' ],
        'Newimages'                 => [ 'Nové_obrázky', 'Galerie_nových_obrázků', 'Nove_obrazky' ],
        'Newpages'                  => [ 'Nové_stránky', 'Nove_stranky', 'Nejnovější_stránky', 'Nejnovejsi_stranky' ],
@@ -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 686ead0..4b5aeb0 100644 (file)
@@ -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..b9280ea 100644 (file)
@@ -105,7 +105,7 @@ $namespaceAliases = [];
  * Example:
  * @code
  * $namespaceGenderAliases = [
- *     NS_USER => [ 'male' => 'Male_user', 'female' => 'Female_user' ],
+ *   NS_USER => [ 'male' => 'Male_user', 'female' => 'Female_user' ],
  * ];
  * @endcode
  */
@@ -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..c74d37b 100644 (file)
@@ -105,5 +105,4 @@ $magicWords = [
        'img_center'                => [ '1', 'erdian', 'center', 'centre' ],
 ];
 
-$separatorTransformTable = [ ',' => '.', '.' => ',' ]; /* Bug 15717 */
-
+$separatorTransformTable = [ ',' => '.', '.' => ',' ]; /* T17717 */
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..e034035 100644 (file)
@@ -28,6 +28,5 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Ñemohenda_myangekõi',
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $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 d9471e0..7fe8773 100644 (file)
@@ -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 ffd164b..0b49204 100644 (file)
@@ -103,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..d5f8f75 100644 (file)
@@ -8,7 +8,7 @@
  *
  */
 
-# $fallback = 'ru'; // bug 27785
+# $fallback = 'ru'; // T29785
 
 $namespaceNames = [
        NS_MEDIA            => 'Медиа',
@@ -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 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..f12be20 100644 (file)
@@ -70,7 +70,7 @@ $namespaceAliases = [
        'Diskusyón_de_Katēggoría'  => NS_CATEGORY_TALK,
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $namespaceGenderAliases = [];
 
 $specialPageAliases = [
@@ -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..6a71ca7 100644 (file)
@@ -18,6 +18,5 @@ $namespaceGenderAliases = [];
 
 $linkPrefixExtension = true;
 
-# Same as the French (bug 8485)
+# Same as the French (T10485)
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index 1c79efd..665b222 100644 (file)
@@ -91,4 +91,3 @@ $digitTransformTable = [
        '8' => '໘', # &#x0ed8;
        '9' => '໙', # &#x0ed9;
 ];
-
index 8bdfc7f..f77049a 100644 (file)
@@ -32,4 +32,3 @@ $namespaceNames = [
 ];
 
 $fallback = 'lv';
-
index d9ef8bc..5214c46 100644 (file)
@@ -151,4 +151,3 @@ $digitTransformTable = [
        '.' => '點',
        ',' => '',
 ];
-
index 45d6f6c..b86bb14 100644 (file)
@@ -55,4 +55,3 @@ $namespaceAliases = [
        'Kategori'           => NS_CATEGORY,
        'Kategori_tartışma'  => NS_CATEGORY_TALK,
 ];
-
index 84b107e..76110ac 100644 (file)
@@ -137,4 +137,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'МезеньСюлмафкстТяса' ],
        'Withoutinterwiki'          => [ 'Интервикифтома' ],
 ];
-
index 653be83..e8df5aa 100644 (file)
@@ -231,4 +231,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Pejy_mirohy' ],
        'Withoutinterwiki'          => [ 'Tsy_misy_interwiki' ],
 ];
-
index 99ab0e5..7d12967 100644 (file)
@@ -91,4 +91,3 @@ $magicWords = [
        'img_bottom'                => [ '1', 'ӱлычын', 'снизу', 'bottom' ],
        'sitename'                  => [ '1', 'САЙТЛӰМ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ],
 ];
-
index 0529a0e..4bee5e1 100644 (file)
@@ -159,4 +159,3 @@ $magicWords = [
        'pagesincategory_pages'     => [ '0', 'laman', 'halaman', 'pages' ],
        'pagesincategory_files'     => [ '0', 'berkas', 'files' ],
 ];
-
index c15b040..cf608fc 100644 (file)
@@ -359,4 +359,3 @@ $magicWords = [
 
 $linkTrail = '/^([a-zабвгдѓежзѕијклљмнњопрстќуфхцчџш]+)(.*)$/sDu';
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index 2c9542b..f6d0d14 100644 (file)
@@ -356,4 +356,3 @@ $magicWords = [
 $linkTrail = "/^([a-z\x{0D02}-\x{0D7F}]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
-
index e63f009..a672fc4 100644 (file)
@@ -47,4 +47,3 @@ $magicWords = [
 ];
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюя“»]+)(.*)$/sDu';
-
index dd8133e..744fe73 100644 (file)
@@ -18,4 +18,3 @@ $specialPageAliases = [
        'Preferences'               => [ 'Преферинце' ],
        'Recentchanges'             => [ 'Модификэрьреченте' ],
 ];
-
index 61fc613..b51839d 100644 (file)
@@ -326,4 +326,3 @@ $digitTransformTable = [
 $linkTrail = "/^([\xE0\xA4\x80-\xE0\xA5\xA3\xE0\xA5\xB1-\xE0\xA5\xBF\xEF\xBB\xBF\xE2\x80\x8D]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
-
index a9ddf7d..4d01b28 100644 (file)
@@ -42,4 +42,3 @@ $namespaceAliases = [
 
 // Remove Russian aliases
 $namespaceGenderAliases = [];
-
index c39854e..5d720ce 100644 (file)
@@ -211,4 +211,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Pautan_ke_sini', 'Pautan_ke' ],
        'Withoutinterwiki'          => [ 'Laman_tanpa_pautan_bahasa' ],
 ];
-
index aad38b7..015dade 100644 (file)
@@ -268,4 +268,3 @@ $magicWords = [
 ];
 
 $linkPrefixCharset = 'A-\\x{10ffff}';
-
index 42afbd9..0dcfe2d 100644 (file)
@@ -75,4 +75,3 @@ $magicWords = [
        'pagesize'                  => [ '1', 'TAMANHOFEXEIRO', 'TAMANHODAPAGINA', 'TAMANHODAPÁGINA', 'PAGESIZE' ],
        'staticredirect'            => [ '1', '_ANCAMINARSTATICO_', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÁTICO__', '__STATICREDIRECT__' ],
 ];
-
index ebaa7ca..3bafe48 100644 (file)
@@ -57,4 +57,3 @@ $dateFormats = [
        'my long date' => 'Y "ဇန်နဝါရီ" F"လ" j "ရက်"',
        'my long both' => 'H:i"၊" Y "ဇန်နဝါရီ" F"လ" j "ရက်"',
 ];
-
index 20057d5..01bc33d 100644 (file)
@@ -183,4 +183,3 @@ $magicWords = [
        'url_path'                  => [ '0', 'ЯН', 'ПУТЬ', 'PATH' ],
        'url_wiki'                  => [ '0', 'ВИКИ', 'WIKI' ],
 ];
-
index 027cf34..e93362b 100644 (file)
@@ -121,4 +121,3 @@ $magicWords = [
        'grammar'                   => [ '0', 'دستور_زبون:', 'دستور_زوون:', 'دستورزبان:', 'دستور_زبان:', 'GRAMMAR:' ],
        'gender'                    => [ '0', 'جنسیت:', 'جنس:', 'GENDER:' ],
 ];
-
index 1bf970c..2aa25ad 100644 (file)
@@ -36,7 +36,7 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Neneuhcāyōtl_tēixnāmiquiliztli',
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $namespaceGenderAliases = [];
 
 $namespaceAliases = [
@@ -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 548b3db..66f0527 100644 (file)
@@ -55,7 +55,7 @@ $bookstoreList = [
        '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 = [
@@ -330,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 5b599a9..7572c67 100644 (file)
@@ -96,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 = [
@@ -321,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 63c1e80..022a9ac 100644 (file)
@@ -30,4 +30,3 @@ $namespaceNames = [
 ];
 
 $linkTrail = '/^([a-zčČšŠžŽäÄöÖ]+)(.*)$/sDu';
-
index 4f500a7..d17105a 100644 (file)
@@ -252,4 +252,3 @@ $magicWords = [
 ];
 
 $digitGroupingPattern = "##,##,###";
-
index 5ba4ff5..44e943e 100644 (file)
@@ -179,4 +179,3 @@ $magicWords = [
 
 $linkTrail = '/^((?:[a-z]|а|æ|б|в|г|д|е|ё|ж|з|и|й|к|л|м|н|о|п|р|с|т|у|ф|х|ц|ч|ш|щ|ъ|ы|ь|э|ю|я|“|»)+)(.*)$/sDu';
 $fallback8bitEncoding = 'windows-1251';
-
index 856ffa2..253119b 100644 (file)
@@ -182,4 +182,3 @@ $magicWords = [
 $linkTrail = '/^([ਁਂਃਅਆਇਈਉਊਏਐਓਔਕਖਗਘਙਚਛਜਝਞਟਠਡਢਣਤਥਦਧਨਪਫਬਭਮਯਰਲਲ਼ਵਸ਼ਸਹ਼ਾਿੀੁੂੇੈੋੌ੍ਖ਼ਗ਼ਜ਼ੜਫ਼ੰੱੲੳa-z]+)(.*)$/sDu';
 
 $digitGroupingPattern = "##,##,###";
-
index ff9a2b4..62c8418 100644 (file)
@@ -14,4 +14,3 @@ $fallback = 'fr';
 
 // Remove French aliases
 $namespaceGenderAliases = [];
-
index 449ec0e..bd13273 100644 (file)
@@ -58,4 +58,3 @@ $specialPageAliases = [
        'Listbots'                  => [ 'Waddefresser', 'Bots' ],
        'Search'                    => [ 'Uffgucke', 'Suche' ],
 ];
-
index 1e4706d..6365b8a 100644 (file)
@@ -60,4 +60,3 @@ $namespaceAliases = [
 
 // Remove German aliases
 $namespaceGenderAliases = [];
-
index f49889a..7062e07 100644 (file)
@@ -42,4 +42,3 @@ $digitTransformTable = [
        '8' => '८', # &#x096e;
        '9' => '९', # &#x096f;
 ];
-
index cfe0345..01a9d1a 100644 (file)
@@ -120,7 +120,7 @@ $dateFormats = [
 
 $fallback8bitEncoding = 'iso-8859-2';
 $separatorTransformTable = [
-       ',' => "\xc2\xa0", // @bug 2749
+       ',' => "\xc2\xa0", // T4749
        '.' => ','
 ];
 
@@ -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 fcbdac4..65ce3d8 100644 (file)
@@ -37,3 +37,11 @@ $namespaceNames = [
        NS_CATEGORY         => 'گٹھ',
        NS_CATEGORY_TALK    => 'گٹھ_گل_بات',
 ];
+
+$namespaceAliases = [
+       'تصویر' => NS_FILE,
+];
+
+$magicWords = [
+       'redirect' => [ '0', '#مڑجوڑ', '#REDIRECT' ],
+];
index e40b22b..410927b 100644 (file)
@@ -55,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..78503cc 100644 (file)
@@ -111,7 +111,7 @@ $dateFormats = [
 ];
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-$linkTrail = '/^([áâãàéêẽçíòóôõq̃úüűũa-z]+)(.*)$/sDu'; # Bug 21168, 27633
+$linkTrail = '/^([áâãàéêẽçíòóôõq̃úüűũa-z]+)(.*)$/sDu'; # T23168, T29633
 
 $specialPageAliases = [
        'Activeusers'               => [ 'Utilizadores_activos' ],
@@ -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..8488159 100644 (file)
@@ -36,7 +36,7 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Katiguriya_rimanakuy',
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $namespaceGenderAliases = [];
 
 $specialPageAliases = [
@@ -277,4 +277,3 @@ $magicWords = [
        'protectionlevel'           => [ '1', 'HAYKAAMACHAY', 'IMASINCHIAMACHAY', 'NIVELDEPROTECCIÓN', 'PROTECTIONLEVEL' ],
        'formatdate'                => [ '0', 'punchawrikchakuy', 'formatodefecha', 'formatearfecha', 'formatdate', 'dateformat' ],
 ];
-
index a85d801..e960abd 100644 (file)
@@ -32,6 +32,5 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Samiyachiy_rimanakuy',
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $namespaceGenderAliases = [];
-
index 7304dbf..d4da53f 100644 (file)
@@ -40,4 +40,3 @@ $magicWords = [
        'img_manualthumb'           => [ '1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ],
        'img_upright'               => [ '1', 'sidretg', 'sidretg=$1', 'sidretg_$1', 'upright', 'upright=$1', 'upright $1' ],
 ];
-
index 0a5fd11..cb6b47d 100644 (file)
@@ -30,4 +30,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Shopni',
        NS_CATEGORY_TALK    => 'Shopni_vakyarimata',
 ];
-
index 8b92171..55674ce 100644 (file)
@@ -292,4 +292,3 @@ $dateFormats = [
 $fallback8bitEncoding = 'iso8859-2';
 
 $linkTrail = '/^([a-zăâîşţșțĂÂÎŞŢȘȚ]+)(.*)$/sDu';
-
index 29627a6..7c3663a 100644 (file)
@@ -23,4 +23,3 @@ $specialPageAliases = [
        'Version'                   => [ 'Versione' ],
        'Watchlist'                 => [ 'PàggeneCondrollete' ],
 ];
-
index e1af8f3..3041abd 100644 (file)
@@ -413,7 +413,7 @@ $bookstoreList = [
        'Яндекс.Маркет' => 'http://market.yandex.ru/search.xml?text=$1',
        'ОЗОН' => 'http://www.ozon.ru/?context=advsearch_book&isbn=$1',
        'Books.Ru' => 'http://www.books.ru/shop/search?query=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 /**
@@ -439,4 +439,3 @@ $imageFiles = [
 ];
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюя]+)(.*)$/sDu';
-
index 34832b0..6225aef 100644 (file)
@@ -128,4 +128,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Одказы_гев' ],
        'Withoutinterwiki'          => [ 'Без_інтервікі' ],
 ];
-
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..d2ce357 100644 (file)
@@ -321,7 +321,7 @@ $magicWords = [
 
 $linkTrail = '/^([a-zåäöéÅÄÖÉ]+)(.*)$/sDu';
 $separatorTransformTable = [
-       ',' => "\xc2\xa0", // @bug 2749
+       ',' => "\xc2\xa0", // T4749
        '.' => ','
 ];
 
@@ -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..c30e963 100644 (file)
@@ -44,7 +44,7 @@ $namespaceNames = [
 ];
 
 $namespaceAliases = [
-       // Aliases for Polish namespaces (bug 34988).
+       // Aliases for Polish namespaces (T36988).
        'Specjalna'            => NS_SPECIAL,
        'Dyskusja'             => NS_TALK,
        'Użytkownik'           => NS_USER,
@@ -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..4f385cf 100644 (file)
@@ -50,7 +50,7 @@ $namespaceNames = [
 $namespaceAliases = [
        'సభ్యులు' => NS_USER,
        'సభ్యులపై_చర్చ' => NS_USER_TALK,
-       'సభ్యుడు' => NS_USER, # set for bug 11615
+       'సభ్యుడు' => NS_USER, # set for T13615
        'సభ్యునిపై_చర్చ' => NS_USER_TALK,
        'బొమ్మ' => NS_FILE,
        'బొమ్మపై_చర్చ' => NS_FILE_TALK,
@@ -147,4 +147,3 @@ $magicWords = [
 $linkTrail = "/^([\xE0\xB0\x81-\xE0\xB1\xAF]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
-
index 6680d3c..18eb9fa 100644 (file)
@@ -69,4 +69,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Pájina_sira_ne\'ebé_bá_iha_ne\'e' ],
        'Withoutinterwiki'          => [ 'Laiha_interwiki' ],
 ];
-
index 9c58ee6..bd107f5 100644 (file)
@@ -67,4 +67,3 @@ $dateFormats = [
 ];
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхчшъэюяғӣқўҳҷцщыь]+)(.*)$/sDu';
-
index 484d400..39b636a 100644 (file)
@@ -190,4 +190,3 @@ $dateFormats = [
        'ISO 8601 date' => 'xnY-xnm-xnd',
        'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
 ];
-
index 484446b..1ae4716 100644 (file)
@@ -35,4 +35,3 @@ $namespaceNames = [
 ];
 
 $linkTrail = '/^([a-zÄäÇçĞğŇňÖöŞşÜüÝýŽž]+)(.*)$/sDu';
-
index 0c1813c..949969b 100644 (file)
@@ -144,4 +144,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Ano_ang_nakakawing_dito' ],
        'Withoutinterwiki'          => [ 'Walang_ugnayang-wiki' ],
 ];
-
index 613cb28..ed0ff28 100644 (file)
@@ -154,4 +154,3 @@ $magicWords = [
        'pagesize'                  => [ '1', 'СӘҺИФӘ_ПАМЈӘ', 'PAGESIZE' ],
        'url_wiki'                  => [ '0', 'ВИКИ', 'WIKI' ],
 ];
-
index 8e8d475..16fa65f 100644 (file)
@@ -47,4 +47,3 @@ $specialPageAliases = [
        'Watchlist'                 => [ 'Lukautbuk' ],
        'Whatlinkshere'             => [ 'Ol link ikam long hia' ],
 ];
-
index 9e07263..564da6c 100644 (file)
@@ -354,4 +354,3 @@ $magicWords = [
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $linkTrail = '/^([a-zÇĞçğİıÖöŞşÜüÂâÎîÛû]+)(.*)$/sDu';
-
index 34c3cca..9d95444 100644 (file)
@@ -210,4 +210,3 @@ $magicWords = [
 ];
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюяӘәӨөҮүҖҗҢңҺһ]+)(.*)$/sDu';
-
index da073b1..c545012 100644 (file)
@@ -89,4 +89,3 @@ $magicWords = [
 $fallback8bitEncoding = "windows-1254";
 
 $linkTrail = '/^([a-zäçğıñöşü“»]+)(.*)$/sDu';
-
index cc9e2a3..7742b68 100644 (file)
@@ -15,4 +15,3 @@ $fallback = 'fr';
 
 // Remove French aliases
 $namespaceGenderAliases = [];
-
index 32194f6..01254e7 100644 (file)
@@ -116,8 +116,7 @@ $bookstoreList = [
        'ОЗОН' => 'http://www.ozon.ru/?context=advsearch_book&isbn=$1',
        'Books.Ru' => 'http://www.books.ru/shop/search/advanced?as%5Btype%5D=books&as%5Bname%5D=&as%5Bisbn%5D=$1&as%5Bauthor%5D=&as%5Bmaker%5D=&as%5Bcontents%5D=&as%5Binfo%5D=&as%5Bdate_after%5D=&as%5Bdate_before%5D=&as%5Bprice_less%5D=&as%5Bprice_more%5D=&as%5Bstrict%5D=%E4%E0&as%5Bsub%5D=%E8%F1%EA%E0%F2%FC&x=22&y=8',
        'Яндекс.Маркет' => 'http://market.yandex.ru/search.xml?text=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1',
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1',
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
        'Barnes & Noble' => 'http://shop.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1'
 ];
-
index 79cf100..46d5dcb 100644 (file)
@@ -45,4 +45,3 @@ $namespaceGenderAliases = [];
 $linkTrail = '/^([a-zа-яёӝӟӥӧӵ]+)(.*)$/sDu';
 $fallback8bitEncoding = 'windows-1251';
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index 13d5775..492fbcb 100644 (file)
@@ -45,4 +45,3 @@ $specialPageAliases = [
        'Allpages'                  => [ 'بارلىق_بەتلەر' ],
        'Ancientpages'              => [ 'كونا_بەتلەر' ],
 ];
-
index 0c381e5..480d94f 100644 (file)
@@ -121,7 +121,7 @@ $dateFormats = [
 ];
 
 $bookstoreList = [
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 // Russian names are kept for backwards compatibility
index d5449bf..cac8482 100644 (file)
@@ -167,4 +167,3 @@ $magicWords = [
        'index'                     => [ '1', '__اشاریہ__', '__INDEX__' ],
        'noindex'                   => [ '1', '__نااشاریہ__', '__NOINDEX__' ],
 ];
-
index 1f3aae2..53d8efa 100644 (file)
@@ -123,4 +123,3 @@ $separatorTransformTable = [
        '.' => ',',
        ',' => "\xc2\xa0", # nbsp
 ];
-
index f71092c..986d9bd 100644 (file)
@@ -155,4 +155,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'PuntaQua' ],
        'Withoutinterwiki'          => [ 'PagineSensaInterwiki' ],
 ];
-
index 0283b7d..b28c618 100644 (file)
@@ -85,4 +85,3 @@ $magicWords = [
        'fullurl'                   => [ '0', 'TÄUZ\'URL:', 'KOGUURL:', 'FULLURL:' ],
        'index'                     => [ '1', '__INDEKS__', 'INDEKSIGA', '__INDEX__' ],
 ];
-
index 201a677..64d4604 100644 (file)
@@ -351,4 +351,3 @@ $datePreferenceMigrationMap = [
 
 $linkTrail = "/^([a-zàâçéèêîôûäëïöüùÇÉÂÊÎÔÛÄËÏÖÜÀÈÙ]+)(.*)$/sDu";
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index a28777f..271fae1 100644 (file)
@@ -31,4 +31,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Categorie',
        NS_CATEGORY_TALK    => 'Discuusje_categorie',
 ];
-
index 7400417..1a29f02 100644 (file)
@@ -61,4 +61,3 @@ $specialPageAliases = [
 
 // Remove German aliases
 $namespaceGenderAliases = [];
-
index ffb788a..d0f5ca5 100644 (file)
@@ -109,4 +109,3 @@ $specialPageAliases = [
        'Watchlist'                 => [ 'Galädalised' ],
        'Whatlinkshere'             => [ 'Yümsisio', 'Isio' ],
 ];
-
index 4829601..bef241a 100644 (file)
@@ -39,4 +39,3 @@ $namespaceNames = [
 $magicWords = [
        'redirect'                  => [ '0', '#saadaq', '#suuna', '#REDIRECT' ],
 ];
-
index 45841fd..68f3ae7 100644 (file)
@@ -83,4 +83,3 @@ $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 
 # $linkTrail = '/^([a-zåâêîôûçéèA-ZÅÂÊÎÔÛÇÉÈ]+)(.*)$/sDu';
 $linkTrail = '/^([a-zåâêîôûçéè]+)(.*)$/sDu';
-
index 1c6e9b5..8243e15 100644 (file)
@@ -60,4 +60,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'AnoAnNasumpayDinhi' ],
        'Withoutinterwiki'          => [ 'Warayinterwiki' ],
 ];
-
index d96b51f..7722884 100644 (file)
@@ -80,4 +80,3 @@ $specialPageAliases = [
        'Wantedpages'               => [ 'Xët yiñ laaj' ],
        'Watchlist'                 => [ 'Limu toppte' ],
 ];
-
index 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..f62614b 100644 (file)
@@ -20,7 +20,7 @@ $fallback = 'nl';
 
 /**
  * Namespace names
- * (bug 8708)
+ * (T10708)
  */
 $namespaceNames = [
        NS_MEDIA            => 'Media',
@@ -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 3925efe..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
diff --git a/maintenance/addSite.php b/maintenance/addSite.php
new file mode 100755 (executable)
index 0000000..1ebc4f6
--- /dev/null
@@ -0,0 +1,91 @@
+<?php
+
+use MediaWiki\MediaWikiServices;
+
+$basePath = getenv( 'MW_INSTALL_PATH' ) !== false ? getenv( 'MW_INSTALL_PATH' ) : __DIR__ . '/..';
+
+require_once $basePath . '/maintenance/Maintenance.php';
+
+/**
+ * Maintenance script for adding a site definition into the sites table.
+ *
+ * @since 1.29
+ *
+ * @license GNU GPL v2+
+ * @author Florian Schmidt
+ */
+class AddSite extends Maintenance {
+
+       public function __construct() {
+               $this->addDescription( 'Add a site definition into the sites table.' );
+
+               $this->addArg( 'globalid', 'The global id of the site to add, e.g. "wikipedia".', true );
+               $this->addArg( 'group', 'In which group this site should be sorted in.', true );
+               $this->addOption( 'language', 'The language code of the site, e.g. "de".' );
+               $this->addOption( 'interwiki-id', 'The interwiki ID of the site.' );
+               $this->addOption( 'navigation-id', 'The navigation ID of the site.' );
+               $this->addOption( 'pagepath', 'The URL to pages of this site, e.g.' .
+                       ' https://example.com/wiki/\$1.' );
+               $this->addOption( 'filepath', 'The URL to files of this site, e.g. https://example
+               .com/w/\$1.' );
+
+               parent::__construct();
+       }
+
+       /**
+        * Imports the site described by the parameters (see self::__construct()) passed to this
+        * maintenance sccript into the sites table of MediaWiki.
+        */
+       public function execute() {
+               $siteStore = MediaWikiServices::getInstance()->getSiteStore();
+               $siteStore->reset();
+
+               $globalId = $this->getArg( 0 );
+               $group = $this->getArg( 1 );
+               $language = $this->getOption( 'language' );
+               $interwikiId = $this->getOption( 'interwiki-id' );
+               $navigationId = $this->getOption( 'navigation-id' );
+               $pagepath = $this->getOption( 'pagepath' );
+               $filepath = $this->getOption( 'filepath' );
+
+               if ( !is_string( $globalId ) || !is_string( $group ) ) {
+                       echo "Arguments globalid and group need to be strings.\n";
+                       return false;
+               }
+
+               if ( $siteStore->getSite( $globalId ) !== null ) {
+                       echo "Site with global id $globalId already exists.\n";
+                       return false;
+               }
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( $globalId );
+               $site->setGroup( $group );
+               if ( $language !== null ) {
+                       $site->setLanguageCode( $language );
+               }
+               if ( $interwikiId !== null ) {
+                       $site->addInterwikiId( $interwikiId );
+               }
+               if ( $navigationId !== null ) {
+                       $site->addNavigationId( $navigationId );
+               }
+               if ( $pagepath !== null ) {
+                       $site->setPagePath( $pagepath );
+               }
+               if ( $filepath !== null ) {
+                       $site->setFilePath( $filepath );
+               }
+
+               $siteStore->saveSites( [ $site ] );
+
+               if ( method_exists( $siteStore, 'reset' ) ) {
+                       $siteStore->reset();
+               }
+
+               echo "Done.\n";
+       }
+}
+
+$maintClass = 'AddSite';
+require_once RUN_MAINTENANCE_IF_MAIN;
index ddd1d7b..08287cd 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- patch-archive-ar_id.sql
 --
--- Bug 39675. Add archive.ar_id.
+-- T41675. Add archive.ar_id.
 
 ALTER TABLE /*$wgDBprefix*/archive
     ADD COLUMN ar_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
index f5ff1f1..f8b6340 100644 (file)
@@ -1,11 +1,11 @@
 --
 -- patch-categorylinks-better-collation.sql
 --
--- Bugs 164, 1211, 23682.  This is the second version of this patch; the
+-- T2164, T3211, T25682.  This is the second version of this patch; the
 -- changes are also incorporated into patch-categorylinks-better-collation2.sql,
 -- for the benefit of trunk users who applied the original.
 --
--- Due to bug 25254, the length limit of 255 bytes for cl_sortkey_prefix
+-- Due to T27254, the length limit of 255 bytes for cl_sortkey_prefix
 -- is also enforced in php. If you change the length of that field, make
 -- sure to also change the check in LinksUpdate.php.
 ALTER TABLE /*$wgDBprefix*/categorylinks
index d4b51b5..ded8454 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- patch-extenallinks-el_id.sql
 --
--- Bug 15441. Add externallinks.el_id.
+-- T17441. Add externallinks.el_id.
 
 ALTER TABLE /*$wgDBprefix*/externallinks
     ADD COLUMN el_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
index 742841e..c516aaf 100644 (file)
@@ -1,4 +1,4 @@
--- Increase the length of up_property from 32 -> 255 bytes. Bug 19408
+-- Increase the length of up_property from 32 -> 255 bytes. T21408
 
 ALTER TABLE /*_*/user_properties
        MODIFY up_property varbinary(255);
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 befafc1..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
  */
index c92a720..b2f7e96 100644 (file)
@@ -41,7 +41,7 @@ class BenchUtf8TitleCheck extends Benchmarker {
                        "United States of America", // 7bit ASCII
                        "S%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e",
                        "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn",
-                       // This comes from bug 36839
+                       // This comes from T38839
                        "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn%7C"
                        . "Catherine%20Willows%7CDavid%20Hodges%7CDavid%20Phillips%7CGil%20Grissom%7CGreg%20Sanders%7CHodges%7C"
                        . "Internet%20Movie%20Database%7CJim%20Brass%7CLady%20Heather%7C"
index c8f393d..e0da027 100644 (file)
@@ -146,7 +146,7 @@ class ImageCleanup extends TableCleanup {
                 * if the target title exists in the image table, or if both the
                 * original and target titles exist in the page table, append
                 * increasing version numbers until the target title exists in
-                * neither.  (See also bug 16916.)
+                * neither.  (See also T18916.)
                 */
                $version = 0;
                $final = $new;
index 863d74a..83ab35c 100644 (file)
@@ -38,31 +38,43 @@ class CleanupRemovedModules extends Maintenance {
                parent::__construct();
                $this->addDescription(
                        'Remove cache entries for removed ResourceLoader modules from the database' );
-               $this->addOption( 'batchsize', 'Delete rows in batches of this size. Default: 500', false, true );
+               $this->setBatchSize( 500 );
        }
 
        public function execute() {
+               $this->output( "Cleaning up module_deps table...\n" );
+
                $dbw = $this->getDB( DB_MASTER );
                $rl = new ResourceLoader( MediaWikiServices::getInstance()->getMainConfig() );
                $moduleNames = $rl->getModuleNames();
-               $moduleList = implode( ', ', array_map( [ $dbw, 'addQuotes' ], $moduleNames ) );
-               $limit = max( 1, intval( $this->getOption( 'batchsize', 500 ) ) );
+               $res = $dbw->select( 'module_deps',
+                       [ 'md_module', 'md_skin' ],
+                       $moduleNames ? 'md_module NOT IN (' . $dbw->makeList( $moduleNames ) . ')' : '1=1',
+                       __METHOD__
+               );
+               $rows = iterator_to_array( $res, false );
 
-               $this->output( "Cleaning up module_deps table...\n" );
-               $i = 1;
                $modDeps = $dbw->tableName( 'module_deps' );
-               do {
-                       // $dbw->delete() doesn't support LIMIT :(
-                       $where = $moduleList ? "md_module NOT IN ($moduleList)" : '1=1';
-                       $dbw->query( "DELETE FROM $modDeps WHERE $where LIMIT $limit", __METHOD__ );
+               $i = 1;
+               foreach ( array_chunk( $rows, $this->mBatchSize ) as $chunk ) {
+                       // WHERE ( mod=A AND skin=A ) OR ( mod=A AND skin=B) ..
+                       $conds = array_map( function ( stdClass $row ) use ( $dbw ) {
+                               return $dbw->makeList( (array)$row, IDatabase::LIST_AND );
+                       }, $chunk );
+                       $conds = $dbw->makeList( $conds, IDatabase::LIST_OR );
+
+                       $this->beginTransaction( $dbw, __METHOD__ );
+                       $dbw->query( "DELETE FROM $modDeps WHERE $conds", __METHOD__ );
                        $numRows = $dbw->affectedRows();
                        $this->output( "Batch $i: $numRows rows\n" );
+                       $this->commitTransaction( $dbw, __METHOD__ );
+
                        $i++;
-                       wfWaitForSlaves();
-               } while ( $numRows > 0 );
-               $this->output( "done\n" );
+               }
+
+               $this->output( "Done\n" );
        }
 }
 
-$maintClass = "CleanupRemovedModules";
+$maintClass = 'CleanupRemovedModules';
 require_once RUN_MAINTENANCE_IF_MAIN;
index 650fae0..ccc6406 100644 (file)
@@ -138,14 +138,14 @@ class TitleCleanup extends TableCleanup {
                                $prior = $title->getDBkey();
                        }
 
-                       # Old cleanupTitles could move articles there. See bug 23147.
+                       # Old cleanupTitles could move articles there. See T25147.
                        $ns = $row->page_namespace;
                        if ( $ns < 0 ) {
                                $ns = 0;
                        }
 
                        # Namespace which no longer exists. Put the page in the main namespace
-                       # since we don't have any idea of the old namespace name. See bug 68501.
+                       # since we don't have any idea of the old namespace name. See T70501.
                        if ( !MWNamespace::exists( $ns ) ) {
                                $ns = 0;
                        }
index b8001a4..70f3654 100644 (file)
@@ -23,6 +23,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Maintenance script to convert user options to the new `user_properties` table.
  *
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 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 1d6f31d..79f75ef 100644 (file)
@@ -72,7 +72,7 @@ class FixDoubleRedirects extends Maintenance {
                        'rd_from = pa.page_id',
                        'rd_namespace = pb.page_namespace',
                        'rd_title = pb.page_title',
-                       'rd_interwiki IS NULL OR rd_interwiki = ' . $dbr->addQuotes( '' ), // bug 40352
+                       'rd_interwiki IS NULL OR rd_interwiki = ' . $dbr->addQuotes( '' ), // T42352
                        'pb.page_is_redirect' => 1,
                ];
 
index 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 87af5b8..fb00bed 100644 (file)
@@ -523,7 +523,7 @@ class GenerateSitemap extends Maintenance {
        function fileEntry( $url, $date, $priority ) {
                return
                        "\t<url>\n" .
-                       // bug 34666: $url may contain bad characters such as ampersands.
+                       // T36666: $url may contain bad characters such as ampersands.
                        "\t\t<loc>" . htmlspecialchars( $url ) . "</loc>\n" .
                        "\t\t<lastmod>$date</lastmod>\n" .
                        "\t\t<priority>$priority</priority>\n" .
@@ -545,7 +545,7 @@ class GenerateSitemap extends Maintenance {
         * @param int $namespace
         */
        function generateLimit( $namespace ) {
-               // bug 17961: make a title with the longest possible URL in this namespace
+               // T19961: make a title with the longest possible URL in this namespace
                $title = Title::makeTitle( $namespace, str_repeat( "\xf0\xa8\xae\x81", 63 ) . "\xe5\x96\x83" );
 
                $this->limit = [
index a0fe381..2a102b2 100644 (file)
@@ -106,7 +106,7 @@ class HHVMMakeRepo extends Maintenance {
                $cmd = wfEscapeShellArg(
                        $hhvm,
                        '--hphp',
-                   '--target', 'hhbc',
+                       '--target', 'hhbc',
                        '--format', 'binary',
                        '--force', '1',
                        '--keep-tempdir', '1',
index 7f2a9e1..23bdb3f 100644 (file)
@@ -187,6 +187,11 @@ class ImportImages extends Maintenance {
                if ( $count > 0 ) {
 
                        foreach ( $files as $file ) {
+
+                               if ( $sleep && ( $processed > 0 ) ) {
+                                       sleep( $sleep );
+                               }
+
                                $base = UtfNormal\Validator::cleanUp( wfBaseName( $file ) );
 
                                # Validate a title
@@ -375,10 +380,6 @@ class ImportImages extends Maintenance {
                                if ( $limit && $processed >= $limit ) {
                                        break;
                                }
-
-                               if ( $sleep ) {
-                                       sleep( $sleep );
-                               }
                        }
 
                        # Print out some statistics
@@ -496,7 +497,7 @@ class ImportImages extends Maintenance {
        # (preferably batching files too).
        private function getFileCommentFromSourceWiki( $wiki_host, $file ) {
                $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
-                          . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
+                       . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
                $body = Http::get( $url, [], __METHOD__ );
                if ( preg_match( '#<ii comment="([^"]*)" />#', $body, $matches ) == 0 ) {
                        return false;
@@ -507,7 +508,7 @@ class ImportImages extends Maintenance {
 
        private function getFileUserFromSourceWiki( $wiki_host, $file ) {
                $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
-                          . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
+                       . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
                $body = Http::get( $url, [], __METHOD__ );
                if ( preg_match( '#<ii user="([^"]*)" />#', $body, $matches ) == 0 ) {
                        return false;
diff --git a/maintenance/initUserPreference.php b/maintenance/initUserPreference.php
new file mode 100644 (file)
index 0000000..f4da570
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Initialize a user preference based on the value
+ * of another preference.
+ *
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that initializes a user preference
+ * based on the value of another preference.
+ *
+ * @ingroup Maintenance
+ */
+class InitUserPreference extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addOption(
+                       'target',
+                       'Name of the user preference to initialize',
+                       true,
+                       true,
+                       't'
+               );
+               $this->addOption(
+                       'source',
+                       'Name of the user preference to take the value from',
+                       true,
+                       true,
+                       's'
+               );
+               $this->setBatchSize( 300 );
+       }
+
+       public function execute() {
+               $target = $this->getOption( 'target' );
+               $source = $this->getOption( 'source' );
+               $this->output( "Initializing '$target' based on the value of '$source'\n" );
+
+               $dbr = $this->getDB( DB_REPLICA );
+               $dbw = $this->getDB( DB_MASTER );
+
+               $iterator = new BatchRowIterator(
+                       $dbr,
+                       'user_properties',
+                       [ 'up_user', 'up_property' ],
+                       $this->mBatchSize
+               );
+               $iterator->setFetchColumns( [ 'up_user', 'up_value' ] );
+               $iterator->addConditions( [
+                       'up_property' => $source,
+                       'up_value IS NOT NULL',
+                       'up_value != 0',
+               ] );
+
+               $processed = 0;
+               foreach ( $iterator as $batch ) {
+                       foreach ( $batch as $row ) {
+                               $values = [
+                                       'up_user' => $row->up_user,
+                                       'up_property' => $target,
+                                       'up_value' => $row->up_value,
+                               ];
+                               $dbw->upsert(
+                                       'user_properties',
+                                       $values,
+                                       [ 'up_user', 'up_property' ],
+                                       $values,
+                                       __METHOD__
+                               );
+
+                               $processed += $dbw->affectedRows();
+                       }
+               }
+
+               $this->output( "Processed $processed user(s)\n" );
+               $this->output( "Finished!\n" );
+       }
+}
+
+$maintClass = 'InitUserPreference'; // Tells it to run the class
+require_once RUN_MAINTENANCE_IF_MAIN;
index 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..6975e25 100644 (file)
 著絲 着丝
 著麼 着么
 著人 着人
-著什麼      着什么
+著什 着什
 著他 着他
 著令 着令
 著位 着位
 飃著 飘着
 沈著 沉着
 擡著 抬着
\91\97ç\94\9a麽      着什么
\91\97ç\94\9a麼      着什么
 滿著 满着
 滿著名      满著名
 滿著作      满著作
 三極體      三极管
 軟體 软件
 軟體動物   软体动物
+軟體生物   软体生物
 軟體家具   软体家具
 網路 网络
 人工智慧   人工智能
 奈及利亞   尼日利亚
 尼日爾      尼日尔
 巴貝多      巴巴多斯
-巴布亞紐幾內亞  巴布亚新几内亚
 布吉納法索        布基纳法索
 蒲隆地      布隆迪
 帛琉 帕劳
 賓·拉登    本·拉登
 歐巴馬      奥巴马
 北韓 北朝鲜
+台北韓      台北韩
 寮人民民主共和國       老挝人民民主共和国
 寮語 老挝语
 蘭卡威      浮罗交怡
 厄利垂亚   厄立特里亚
 亞歷山卓   亚历山大
 雅穆索戈   亚穆苏克罗
-畿內亞      几内亚
 索馬利蘭   索马里兰
 吉力馬札羅        乞力马扎罗
 索馬利亞   索马里
 千里達      特立尼达
 托巴哥      多巴哥
 多明尼加   多米尼加
+斯堪地那維亞     斯堪的纳维亚
 頻寬 带宽
 數位相機   数码相机
 數位照相機        数码照相机
index 31e02c2..7a07259 100644 (file)
@@ -6,9 +6,11 @@
 汙    污
 溼    濕
 硅    矽
+幺    么
 計畫 計劃
 吧台 吧枱
 坐台 坐枱
+坐台铁      坐台鐵
 妆台 妝枱
 弹珠台      彈珠枱
 折台 摺枱
 占有五不   占有五不
 吞占 吞佔
 一地里      一地裏
-一年里      一年裏
 中文里      中文裏
 英文里      英文裏
 古文里      古文裏
 市里的      市裏的
 年代里      年代裏
 年里 年裏
+年里约      年里約 #里约奧運
 店里 店裏
 庙里 廟裏
 往里 往裏
 点里 點裏
 点里程      點里程
 鼓里 鼓裏
+殿里 殿裏
+队里 隊裏
 世纪里      世紀裏
 夜晚里      夜晚裏
 参数里      參數裏
 沖著。      沖著。
 沖著,      沖著,
 衝著 衝着
\91\97ç\94\9a麽      ç\9d\80ç\94\9a麽
\91\97ç\94\9a麼      ç\9d\80ç\94\9a麼
 存著 存着
 存著名      存著名
 存著作      存著作
 塞席爾      塞舌爾
 安地卡及巴布達  安提瓜和巴布達
 巴貝多      巴巴多斯
-巴布亞紐幾內亞  巴布亞新畿內亞
+紐幾內亞   新幾內亞
 布吉納法索        布基納法索
 蒲隆地      布隆迪
 帕劳 帛琉
 阿拉伯聯合大公國       阿拉伯聯合酋長國
 馬爾地夫   馬爾代夫
 馬利共和國        馬里共和國
+斯堪地那維亞     斯堪的納維亞
 台球 桌球
 撞球 桌球
 冰淇淋      雪糕
 亞斯文      阿斯旺
 奈及利亞   尼日利亞
 雅穆索戈   雅穆蘇克雷
-幾內亞      畿內亞
-几内亚      畿內亞
 衣索匹亞   埃塞俄比亚
 吉力馬札羅        乞力馬札羅
 厄利垂亚   厄立特里亞
index dee2164..6f3304f 100644 (file)
@@ -75,6 +75,7 @@
 於梨华      於梨华
 於潜 於潜
 於志贺      於志贺
+於戏 於戏
 憑藉 凭借
 藉端 借端
 藉故 借故
 么姨 幺姨
 么娘 幺娘
 么孃 幺娘
-幺孃 幺娘
 么弟 幺弟
 么妹 幺妹
 么小 幺小
 么姓 幺姓
 么氏 幺氏
 么蛾子      幺蛾子
-幺厮 幺厮
-麼麼 麽麽
-么麼 幺麽
 么鳳 幺凤
 么二三      幺二三
 么篇 幺篇
-么謙 幺谦
 六么 六幺
 老么 老幺
 么正 幺正
 么女 幺女
 么九 幺九
 么子 幺子
-这么 这么
-那么 那么
-什么 什么
-怎么 怎么
-多么 多么
+姓么 姓幺
+么兒 幺儿
+么喝 幺喝
+么爺 幺爷
+么雞 幺鸡
+么麼 幺麽
+幺麽 幺麽
+麽氏 麽氏
+麼氏 麽氏
 乾乾淨淨   干干净净
 乾乾脆脆   干干脆脆
 肉乾乾      肉干干
index 075deab..d983932 100644 (file)
@@ -15,6 +15,7 @@
 锎    鉲
 钚    鈽
 硅    矽
+幺    么
 煙草 菸草
 烟草 菸草
 煙蒂 菸蒂
 尼日尔      尼日
 尼日爾      尼日
 巴巴多斯   巴貝多
-巴布亚新几内亚  巴布亞紐幾內亞
-巴布亞新畿內亞  巴布亞紐幾內亞
 布基纳法索        布吉納法索
 布基納法索        布吉納法索
 布隆迪      蒲隆地
 波利尼西亚        玻里尼西亞
 波利尼西亞        玻里尼西亞
 新几内亚   紐幾內亞
+新幾內亞   紐幾內亞
 约翰斯顿岛        強斯頓環礁
 巴尔米拉环礁     帕邁拉環礁
 马恩岛      曼島
 阿斯旺      亞斯文
 雅穆苏克雷        雅穆索戈
 雅穆蘇克雷        雅穆索戈
-畿內亞      幾內亞
 索马里兰   索馬利蘭
 索馬里蘭   索馬利蘭
 乞力马扎罗        吉力馬札羅
 得克薩斯   德克薩斯
 蒙特利尔   蒙特婁
 蒙特利爾   蒙特婁
+斯堪的纳维亚     斯堪地那維亞
+斯堪的納維亞     斯堪地那維亞
 麦克尔      麥可
 迈克尔      麥可
 魯賓斯·巴里切羅        魯本·巴瑞切羅
index 3c7ea7a..f106db1 100644 (file)
 划龍舟      划龍舟
 划龍船      划龍船
 只影響      只影響
+義联 義联
+杠轂 杠轂
+局促 侷促
+開山辟谷   開山辟谷
+戲院里      戲院里
+么半 么半
+么元 么元
+么爹 么爹
+么叔 么叔
+么舅 么舅
+么爸 么爸
+么媽 么媽
+么姨 么姨
+么娘 么娘
+么孃 么孃
 么弟 么弟
+么妹 么妹
+么小 么小
+么姓 么姓
+么氏 么氏
+么蛾子      么蛾子
+么鳳 么鳳
+么二三      么二三
+么篇 么篇
 六么 六么
-么雞 么雞
+老么 老么
 么正 么正
 么女 么女
 么九 么九
 么子 么子
-么半 么半
-義联 義联
-杠轂 杠轂
-局促 侷促
-開山辟谷   開山辟谷
-戲院里      戲院里
+姓么 姓么
+么兒 么兒
+么喝 么喝
+么爺 么爺
+么雞 么雞
+么麼 么麼
 惨淡 慘澹
 恶心 噁心
 证谏 証諫
index b4cd628..4effa8e 100644 (file)
 丑三
 丑表功
 公孫丑
-么麼小丑
 平平當當
 滿滿當當
 當當丁丁
 布穀鳥
 穀祿
 穀城縣
+穀氨
+穀胱
 颳雪
 广部
 亂鬨鬨
 喧鬨
 起鬨
 內鬨
-於後
 猜三划五
 划龍舟
 划龍船
 上簽署
 上簽發
 上簽約
+上簽了
 中簽名
 中簽字
 中簽收
 中簽署
 中簽發
 中簽約
+中簽了
 下簽名
 下簽字
 下簽收
 下簽署
 下簽發
 下簽約
+下簽了
 犖确
 磽确
 确瘠
 蒼朮
 赤朮
 朮赤
+莪朮
 博爾朮
+巴而朮
+朮虎高
+耶律朮烈
 髼鬆
 皮鬆
 濛鬆雨
 叶韻
 叶音
 叶恭弘
-置於
-散於
-播於
-國於
-敗於
-畢於
-畢業於
-寒於
-任於
-拘於
-插於
-中於
-敏於
-聽於
-短於
-成於
-樊於期
-淡於
-禍於
-格於
-猛於
-施於
-拒人於
-拒於
-潰於
-窮於
-相於
-形於
-半於
-詢於
-美於
-醜於
-好於
-坏於
-強於
-弱於
-差於
-劣於
-染指於
-存於
-隱於
-藏於
-嚴於
-寬於
-給於
-危於
-於徵
-離於
-麗於
-下於
-亞於
-同於
-屑於
-絕於
-致於
-遜於
-任教於
-教於
-自於
-來於
-附於
-阻於
-囿於
-直於
-建於
-都於
-役於
-助於
-害於
-損於
-益於
-從於
-隨於
-順於
-汲於
-溺於
-迷於
-醉於
-行於
-泥於
-身於
-足於
-溢於
-畏於
-視於
-衷於
-狃於
-疲於
-通於
-老於
-耿於
-服於
-臻於
-匿於
-因於
-似於
-遷於
-怒於
-心於
-集於
-容於
 新紮
 紙紮
 紮鐵
 影相弔
 哀弔
 唁弔
-安於
-迫於
-罷於
-蹪於
-甚於
-等於
-定於
-利於
-對於
-歸於
-難於
-移禍於
-生於
-立於
-多於
-勝於
-傳於
-流於
-過於
-關於
-毀於
-基於
-急於
-嫁禍於
-見於
-鑒於
-始於
-出於
-輕於
-幸於
-怠於
-止於
-至於
-拙於
-忠於
-終於
-重於
-垂於
-善於
-死於
-屬於
-浮於
-在於
-易於
-精於
-由於
-補於
-位於
-寓於
-源於
-且於
-長於
-現於
-較於
-分布於
-散於
-優於
-早於
-晚於
-感於
-用於
-處於
-助於
-便於
-戰於
-葬於
-困於
-適於
-苦於
-落於
-取決於
-着眼於
 鬼谷子
 谷子敬
 洪谷子
 瑞城里
 金城里
 西湖里
+坑口里
 子里甲
 水里商工
 車里雅賓斯克
 區裡有
 實驗裡
 註裡
+殿裡
+隊裡
 裏白 #植物常用名
 烏蘇里 #分詞用
 首發
 高后
 升高後
 提高後
-0年 # 協助分詞
-1年
-2年
-3年
-4年
-5年
-6年
-7年
-8年
-9年
-〇年
-零年
-一年
-兩年
-二年
-三年
-四年
-五年
-六年
-七年
-八年
-九年
-十年
-百年
-千年
-萬年
-億年
 周后
 0周後
 1周後
 伊達里子
 濱田里佳子
 王田里
+田里穗
 小井里
 西井里
 碧河里
 吧檯
 賭檯
 坐檯
+坐台鐵
 妝檯
 餐檯
 工作檯
index 92643bd..e6aac9c 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 396be1d..597a876 100644 (file)
@@ -79,7 +79,7 @@ class MigrateUserGroup extends Maintenance {
                        $affected += $dbw->affectedRows();
                        $this->commitTransaction( $dbw, __METHOD__ );
 
-                       // Clear cache for the affected users (bug 40340)
+                       // Clear cache for the affected users (T42340)
                        if ( $affected > 0 ) {
                                // XXX: This also invalidates cache of unaffected users that
                                // were in the new group and not in the group.
diff --git a/maintenance/mssql/archives/patch-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 ba1f752..78f0671 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).
@@ -299,7 +301,7 @@ CREATE TABLE /*_*/categorylinks (
   -- conversion algorithm is run.  We store this so that we can update
   -- collations without reparsing all pages.
   -- Note: If you change the length of this field, you also need to change
-  -- code in LinksUpdate.php. See bug 25254.
+  -- code in LinksUpdate.php. See T27254.
   cl_sortkey_prefix varbinary(255) NOT NULL default 0x,
 
   -- This isn't really used at present. Provided for an optional
@@ -526,7 +528,7 @@ CREATE TABLE /*_*/ipblocks (
   -- Size chosen to allow IPv6
   -- FIXME: these fields were originally blank for single-IP blocks,
   -- but now they are populated. No migration was ever done. They
-  -- should be fixed to be blank again for such blocks (bug 49504).
+  -- should be fixed to be blank again for such blocks (T51504).
   ipb_range_start varchar(255) NOT NULL,
   ipb_range_end varchar(255) NOT NULL,
 
index b705500..80e8011 100644 (file)
@@ -25,6 +25,8 @@
  */
 
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 require_once __DIR__ . '/Maintenance.php';
 
@@ -224,7 +226,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'];
@@ -570,7 +572,7 @@ class NamespaceConflictChecker extends Maintenance {
        /**
         * Merge page histories
         *
-        * @param integer $id The page_id
+        * @param stdClass $row Page row
         * @param Title $newTitle The new title
         * @return bool
         */
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 edb3398..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,
index 5e44faf..a9457c2 100644 (file)
@@ -136,7 +136,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
 
                $content = $rev->getContent();
                if ( !$content ) {
-                       # This should not happen, but sometimes does (bug 20757)
+                       # This should not happen, but sometimes does (T22757)
                        $id = $row->$idCol;
                        $this->output( "Content of $table $id unavailable!\n" );
 
index 095c266..fb97e91 100644 (file)
@@ -156,10 +156,10 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                } catch ( Exception $e ) {
                        $this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
 
-                       return false; // bug 22624?
+                       return false; // T24624?
                }
                if ( !is_string( $text ) ) {
-                       # This should not happen, but sometimes does (bug 20757)
+                       # This should not happen, but sometimes does (T22757)
                        $this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
 
                        return false;
@@ -185,11 +185,11 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                } catch ( Exception $e ) {
                        $this->output( "Text of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
 
-                       return false; // bug 22624?
+                       return false; // T24624?
                }
                $text = $rev->getSerializedData();
                if ( !is_string( $text ) ) {
-                       # This should not happen, but sometimes does (bug 20757)
+                       # This should not happen, but sometimes does (T22757)
                        $this->output( "Data of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
 
                        return false;
index 61ad075..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,
index b354399..cf65c69 100644 (file)
@@ -23,6 +23,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Maintenance script that sends purge requests for pages edited in a date
  * range to squid/varnish.
diff --git a/maintenance/purgeModuleDeps.php b/maintenance/purgeModuleDeps.php
new file mode 100644 (file)
index 0000000..3088baa
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Remove all cache entries for ResourceLoader modules from the database.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Timo Tijhof
+ */
+
+use MediaWiki\MediaWikiServices;
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to purge the module_deps database cache table.
+ *
+ * @ingroup Maintenance
+ */
+class PurgeModuleDeps extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription(
+                       'Remove all cache entries for ResourceLoader modules from the database' );
+               $this->setBatchSize( 500 );
+       }
+
+       public function execute() {
+               $this->output( "Cleaning up module_deps table...\n" );
+
+               $dbw = $this->getDB( DB_MASTER );
+               $res = $dbw->select( 'module_deps', [ 'md_module', 'md_skin' ], [], __METHOD__ );
+               $rows = iterator_to_array( $res, false );
+
+               $modDeps = $dbw->tableName( 'module_deps' );
+               $i = 1;
+               foreach ( array_chunk( $rows, $this->mBatchSize ) as $chunk ) {
+                       // WHERE ( mod=A AND skin=A ) OR ( mod=A AND skin=B) ..
+                       $conds = array_map( function ( stdClass $row ) use ( $dbw ) {
+                               return $dbw->makeList( (array)$row, IDatabase::LIST_AND );
+                       }, $chunk );
+                       $conds = $dbw->makeList( $conds, IDatabase::LIST_OR );
+
+                       $this->beginTransaction( $dbw, __METHOD__ );
+                       $dbw->query( "DELETE FROM $modDeps WHERE $conds", __METHOD__ );
+                       $numRows = $dbw->affectedRows();
+                       $this->output( "Batch $i: $numRows rows\n" );
+                       $this->commitTransaction( $dbw, __METHOD__ );
+
+                       $i++;
+               }
+
+               $this->output( "Done\n" );
+       }
+}
+
+$maintClass = 'PurgeModuleDeps';
+require_once RUN_MAINTENANCE_IF_MAIN;
index da8a6bc..3520279 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' );
@@ -137,7 +140,7 @@ class RebuildFileCache extends Maintenance {
 
                                        MediaWiki\suppressWarnings(); // header notices
                                        // Cache ?action=view
-                                       $wgRequestTime = microtime( true ); # bug 22852
+                                       $wgRequestTime = microtime( true ); # T24852
                                        ob_start();
                                        $article->view();
                                        $context->getOutput()->output();
@@ -145,7 +148,7 @@ class RebuildFileCache extends Maintenance {
                                        $viewHtml = ob_get_clean();
                                        $viewCache->saveToFileCache( $viewHtml );
                                        // Cache ?action=history
-                                       $wgRequestTime = microtime( true ); # bug 22852
+                                       $wgRequestTime = microtime( true ); # T24852
                                        ob_start();
                                        Action::factory( 'history', $article, $context )->show();
                                        $context->getOutput()->output();
index 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 e7a4d06..06fcbaf 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();
                                        }
@@ -261,7 +272,9 @@ class RefreshLinks extends Maintenance {
                        return;
                }
 
-               foreach ( $content->getSecondaryDataUpdates( $page->getTitle() ) as $update ) {
+               $updates = $content->getSecondaryDataUpdates(
+                       $page->getTitle(), /* $old = */ null, /* $recursive = */ false );
+               foreach ( $updates as $update ) {
                        DeferredUpdates::addUpdate( $update );
                }
        }
@@ -379,6 +392,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 +405,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;
index cc976ed..58472e9 100644 (file)
@@ -24,6 +24,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Maintenance script that sends SQL queries from the specified file to the database.
  *
@@ -50,7 +52,7 @@ class MwSql extends Maintenance {
                $wiki = $this->hasOption( 'wikidb' ) ? $this->getOption( 'wikidb' ) : false;
                // Get the appropriate load balancer (for this wiki)
                if ( $this->hasOption( 'cluster' ) ) {
-                       $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ), $wiki );
+                       $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ) );
                } else {
                        $lb = wfGetLB( $wiki );
                }
@@ -137,7 +139,7 @@ class MwSql extends Maintenance {
                        }
                        if ( $historyFile ) {
                                # Delimiter is eated by streamStatementEnd, we add it
-                               # up in the history (bug 37020)
+                               # up in the history (T39020)
                                readline_add_history( $wholeLine . ';' );
                                readline_write_history( $historyFile );
                        }
@@ -159,7 +161,7 @@ class MwSql extends Maintenance {
 
        /**
         * Print the results, callback for $db->sourceStream()
-        * @param ResultWrapper $res The results object
+        * @param ResultWrapper|bool $res The results object
         * @param IDatabase $db
         */
        public function sqlPrintResult( $res, $db ) {
index f322a03..2d0c9ee 100644 (file)
@@ -3,7 +3,7 @@
 -- Unique indexes need to be handled with INSERT SELECT since just running
 -- the CREATE INDEX statement will fail if there are duplicate values.
 --
--- Ignore duplicates, several tables will have them (e.g. bug 16966) but in
+-- Ignore duplicates, several tables will have them (e.g. T18966) but in
 -- most cases it's harmless to discard them.
 
 --------------------------------------------------------------------------------
diff --git a/maintenance/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);
diff --git a/maintenance/storage/fixBug20757.php b/maintenance/storage/fixBug20757.php
deleted file mode 100644 (file)
index b444f31..0000000
+++ /dev/null
@@ -1,349 +0,0 @@
-<?php
-/**
- * Script to fix bug 20757.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance ExternalStorage
- */
-
-require_once __DIR__ . '/../Maintenance.php';
-
-/**
- * Maintenance script to fix bug 20757.
- *
- * @ingroup Maintenance ExternalStorage
- */
-class FixBug20757 extends Maintenance {
-       public $batchSize = 10000;
-       public $mapCache = [];
-       public $mapCacheSize = 0;
-       public $maxMapCacheSize = 1000000;
-
-       function __construct() {
-               parent::__construct();
-               $this->addDescription( 'Script to fix bug 20757 assuming that blob_tracking is intact' );
-               $this->addOption( 'dry-run', 'Report only' );
-               $this->addOption( 'start', 'old_id to start at', false, true );
-       }
-
-       function execute() {
-               $dbr = $this->getDB( DB_REPLICA );
-               $dbw = $this->getDB( DB_MASTER );
-
-               $dryRun = $this->getOption( 'dry-run' );
-               if ( $dryRun ) {
-                       print "Dry run only.\n";
-               }
-
-               $startId = $this->getOption( 'start', 0 );
-               $numGood = 0;
-               $numFixed = 0;
-               $numBad = 0;
-
-               $totalRevs = $dbr->selectField( 'text', 'MAX(old_id)', false, __METHOD__ );
-
-               // In MySQL 4.1+, the binary field old_text has a non-working LOWER() function
-               $lowerLeft = 'LOWER(CONVERT(LEFT(old_text,22) USING latin1))';
-
-               while ( true ) {
-                       print "ID: $startId / $totalRevs\r";
-
-                       $res = $dbr->select(
-                               'text',
-                               [ 'old_id', 'old_flags', 'old_text' ],
-                               [
-                                       'old_id > ' . intval( $startId ),
-                                       'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\'',
-                                       "$lowerLeft = 'o:15:\"historyblobstub\"'",
-                               ],
-                               __METHOD__,
-                               [
-                                       'ORDER BY' => 'old_id',
-                                       'LIMIT' => $this->batchSize,
-                               ]
-                       );
-
-                       if ( !$res->numRows() ) {
-                               break;
-                       }
-
-                       $secondaryIds = [];
-                       $stubs = [];
-
-                       foreach ( $res as $row ) {
-                               $startId = $row->old_id;
-
-                               // Basic sanity checks
-                               $obj = unserialize( $row->old_text );
-                               if ( $obj === false ) {
-                                       print "{$row->old_id}: unrecoverable: cannot unserialize\n";
-                                       ++$numBad;
-                                       continue;
-                               }
-
-                               if ( !is_object( $obj ) ) {
-                                       print "{$row->old_id}: unrecoverable: unserialized to type " .
-                                               gettype( $obj ) . ", possible double-serialization\n";
-                                       ++$numBad;
-                                       continue;
-                               }
-
-                               if ( strtolower( get_class( $obj ) ) !== 'historyblobstub' ) {
-                                       print "{$row->old_id}: unrecoverable: unexpected object class " .
-                                               get_class( $obj ) . "\n";
-                                       ++$numBad;
-                                       continue;
-                               }
-
-                               // Process flags
-                               $flags = explode( ',', $row->old_flags );
-                               if ( in_array( 'utf-8', $flags ) || in_array( 'utf8', $flags ) ) {
-                                       $legacyEncoding = false;
-                               } else {
-                                       $legacyEncoding = true;
-                               }
-
-                               // Queue the stub for future batch processing
-                               $id = intval( $obj->mOldId );
-                               $secondaryIds[] = $id;
-                               $stubs[$row->old_id] = [
-                                       'legacyEncoding' => $legacyEncoding,
-                                       'secondaryId' => $id,
-                                       'hash' => $obj->mHash,
-                               ];
-                       }
-
-                       $secondaryIds = array_unique( $secondaryIds );
-
-                       if ( !count( $secondaryIds ) ) {
-                               continue;
-                       }
-
-                       // Run the batch query on blob_tracking
-                       $res = $dbr->select(
-                               'blob_tracking',
-                               '*',
-                               [
-                                       'bt_text_id' => $secondaryIds,
-                               ],
-                               __METHOD__
-                       );
-                       $trackedBlobs = [];
-                       foreach ( $res as $row ) {
-                               $trackedBlobs[$row->bt_text_id] = $row;
-                       }
-
-                       // Process the stubs
-                       foreach ( $stubs as $primaryId => $stub ) {
-                               $secondaryId = $stub['secondaryId'];
-                               if ( !isset( $trackedBlobs[$secondaryId] ) ) {
-                                       // No tracked blob. Work out what went wrong
-                                       $secondaryRow = $dbr->selectRow(
-                                               'text',
-                                               [ 'old_flags', 'old_text' ],
-                                               [ 'old_id' => $secondaryId ],
-                                               __METHOD__
-                                       );
-                                       if ( !$secondaryRow ) {
-                                               print "$primaryId: unrecoverable: secondary row is missing\n";
-                                               ++$numBad;
-                                       } elseif ( $this->isUnbrokenStub( $stub, $secondaryRow ) ) {
-                                               // Not broken yet, and not in the tracked clusters so it won't get
-                                               // broken by the current RCT run.
-                                               ++$numGood;
-                                       } elseif ( strpos( $secondaryRow->old_flags, 'external' ) !== false ) {
-                                               print "$primaryId: unrecoverable: secondary gone to {$secondaryRow->old_text}\n";
-                                               ++$numBad;
-                                       } else {
-                                               print "$primaryId: unrecoverable: miscellaneous corruption of secondary row\n";
-                                               ++$numBad;
-                                       }
-                                       unset( $stubs[$primaryId] );
-                                       continue;
-                               }
-                               $trackRow = $trackedBlobs[$secondaryId];
-
-                               // Check that the specified text really is available in the tracked source row
-                               $url = "DB://{$trackRow->bt_cluster}/{$trackRow->bt_blob_id}/{$stub['hash']}";
-                               $text = ExternalStore::fetchFromURL( $url );
-                               if ( $text === false ) {
-                                       print "$primaryId: unrecoverable: source text missing\n";
-                                       ++$numBad;
-                                       unset( $stubs[$primaryId] );
-                                       continue;
-                               }
-                               if ( md5( $text ) !== $stub['hash'] ) {
-                                       print "$primaryId: unrecoverable: content hashes do not match\n";
-                                       ++$numBad;
-                                       unset( $stubs[$primaryId] );
-                                       continue;
-                               }
-
-                               // Find the page_id and rev_id
-                               // The page is probably the same as the page of the secondary row
-                               $pageId = intval( $trackRow->bt_page );
-                               if ( !$pageId ) {
-                                       $revId = $pageId = 0;
-                               } else {
-                                       $revId = $this->findTextIdInPage( $pageId, $primaryId );
-                                       if ( !$revId ) {
-                                               // Actually an orphan
-                                               $pageId = $revId = 0;
-                                       }
-                               }
-
-                               $newFlags = $stub['legacyEncoding'] ? 'external' : 'external,utf-8';
-
-                               if ( !$dryRun ) {
-                                       // Reset the text row to point to the original copy
-                                       $this->beginTransaction( $dbw, __METHOD__ );
-                                       $dbw->update(
-                                               'text',
-                                               // SET
-                                               [
-                                                       'old_flags' => $newFlags,
-                                                       'old_text' => $url
-                                               ],
-                                               // WHERE
-                                               [ 'old_id' => $primaryId ],
-                                               __METHOD__
-                                       );
-
-                                       // Add a blob_tracking row so that the new reference can be recompressed
-                                       // without needing to run trackBlobs.php again
-                                       $dbw->insert( 'blob_tracking',
-                                               [
-                                                       'bt_page' => $pageId,
-                                                       'bt_rev_id' => $revId,
-                                                       'bt_text_id' => $primaryId,
-                                                       'bt_cluster' => $trackRow->bt_cluster,
-                                                       'bt_blob_id' => $trackRow->bt_blob_id,
-                                                       'bt_cgz_hash' => $stub['hash'],
-                                                       'bt_new_url' => null,
-                                                       'bt_moved' => 0,
-                                               ],
-                                               __METHOD__
-                                       );
-                                       $this->commitTransaction( $dbw, __METHOD__ );
-                                       $this->waitForSlaves();
-                               }
-
-                               print "$primaryId: resolved to $url\n";
-                               ++$numFixed;
-                       }
-               }
-
-               print "\n";
-               print "Fixed: $numFixed\n";
-               print "Unrecoverable: $numBad\n";
-               print "Good stubs: $numGood\n";
-       }
-
-       function waitForSlaves() {
-               static $iteration = 0;
-               ++$iteration;
-               if ( ++$iteration > 50 == 0 ) {
-                       wfWaitForSlaves();
-                       $iteration = 0;
-               }
-       }
-
-       function findTextIdInPage( $pageId, $textId ) {
-               $ids = $this->getRevTextMap( $pageId );
-               if ( !isset( $ids[$textId] ) ) {
-                       return null;
-               } else {
-                       return $ids[$textId];
-               }
-       }
-
-       function getRevTextMap( $pageId ) {
-               if ( !isset( $this->mapCache[$pageId] ) ) {
-                       // Limit cache size
-                       while ( $this->mapCacheSize > $this->maxMapCacheSize ) {
-                               $key = key( $this->mapCache );
-                               $this->mapCacheSize -= count( $this->mapCache[$key] );
-                               unset( $this->mapCache[$key] );
-                       }
-
-                       $dbr = $this->getDB( DB_REPLICA );
-                       $map = [];
-                       $res = $dbr->select( 'revision',
-                               [ 'rev_id', 'rev_text_id' ],
-                               [ 'rev_page' => $pageId ],
-                               __METHOD__
-                       );
-                       foreach ( $res as $row ) {
-                               $map[$row->rev_text_id] = $row->rev_id;
-                       }
-                       $this->mapCache[$pageId] = $map;
-                       $this->mapCacheSize += count( $map );
-               }
-
-               return $this->mapCache[$pageId];
-       }
-
-       /**
-        * This is based on part of HistoryBlobStub::getText().
-        * Determine if the text can be retrieved from the row in the normal way.
-        * @param array $stub
-        * @param stdClass $secondaryRow
-        * @return bool
-        */
-       function isUnbrokenStub( $stub, $secondaryRow ) {
-               $flags = explode( ',', $secondaryRow->old_flags );
-               $text = $secondaryRow->old_text;
-               if ( in_array( 'external', $flags ) ) {
-                       $url = $text;
-                       MediaWiki\suppressWarnings();
-                       list( /* $proto */, $path ) = explode( '://', $url, 2 );
-                       MediaWiki\restoreWarnings();
-
-                       if ( $path == "" ) {
-                               return false;
-                       }
-                       $text = ExternalStore::fetchFromURL( $url );
-               }
-               if ( !in_array( 'object', $flags ) ) {
-                       return false;
-               }
-
-               if ( in_array( 'gzip', $flags ) ) {
-                       $obj = unserialize( gzinflate( $text ) );
-               } else {
-                       $obj = unserialize( $text );
-               }
-
-               if ( !is_object( $obj ) ) {
-                       // Correct for old double-serialization bug.
-                       $obj = unserialize( $obj );
-               }
-
-               if ( !is_object( $obj ) ) {
-                       return false;
-               }
-
-               $obj->uncompress();
-               $text = $obj->getItem( $stub['hash'] );
-
-               return $text !== false;
-       }
-}
-
-$maintClass = 'FixBug20757';
-require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/storage/fixT22757.php b/maintenance/storage/fixT22757.php
new file mode 100644 (file)
index 0000000..e8bd23d
--- /dev/null
@@ -0,0 +1,349 @@
+<?php
+/**
+ * Script to fix T22757.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance ExternalStorage
+ */
+
+require_once __DIR__ . '/../Maintenance.php';
+
+/**
+ * Maintenance script to fix T22757.
+ *
+ * @ingroup Maintenance ExternalStorage
+ */
+class FixT22757 extends Maintenance {
+       public $batchSize = 10000;
+       public $mapCache = [];
+       public $mapCacheSize = 0;
+       public $maxMapCacheSize = 1000000;
+
+       function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Script to fix T22757 assuming that blob_tracking is intact' );
+               $this->addOption( 'dry-run', 'Report only' );
+               $this->addOption( 'start', 'old_id to start at', false, true );
+       }
+
+       function execute() {
+               $dbr = $this->getDB( DB_REPLICA );
+               $dbw = $this->getDB( DB_MASTER );
+
+               $dryRun = $this->getOption( 'dry-run' );
+               if ( $dryRun ) {
+                       print "Dry run only.\n";
+               }
+
+               $startId = $this->getOption( 'start', 0 );
+               $numGood = 0;
+               $numFixed = 0;
+               $numBad = 0;
+
+               $totalRevs = $dbr->selectField( 'text', 'MAX(old_id)', false, __METHOD__ );
+
+               // In MySQL 4.1+, the binary field old_text has a non-working LOWER() function
+               $lowerLeft = 'LOWER(CONVERT(LEFT(old_text,22) USING latin1))';
+
+               while ( true ) {
+                       print "ID: $startId / $totalRevs\r";
+
+                       $res = $dbr->select(
+                               'text',
+                               [ 'old_id', 'old_flags', 'old_text' ],
+                               [
+                                       'old_id > ' . intval( $startId ),
+                                       'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\'',
+                                       "$lowerLeft = 'o:15:\"historyblobstub\"'",
+                               ],
+                               __METHOD__,
+                               [
+                                       'ORDER BY' => 'old_id',
+                                       'LIMIT' => $this->batchSize,
+                               ]
+                       );
+
+                       if ( !$res->numRows() ) {
+                               break;
+                       }
+
+                       $secondaryIds = [];
+                       $stubs = [];
+
+                       foreach ( $res as $row ) {
+                               $startId = $row->old_id;
+
+                               // Basic sanity checks
+                               $obj = unserialize( $row->old_text );
+                               if ( $obj === false ) {
+                                       print "{$row->old_id}: unrecoverable: cannot unserialize\n";
+                                       ++$numBad;
+                                       continue;
+                               }
+
+                               if ( !is_object( $obj ) ) {
+                                       print "{$row->old_id}: unrecoverable: unserialized to type " .
+                                               gettype( $obj ) . ", possible double-serialization\n";
+                                       ++$numBad;
+                                       continue;
+                               }
+
+                               if ( strtolower( get_class( $obj ) ) !== 'historyblobstub' ) {
+                                       print "{$row->old_id}: unrecoverable: unexpected object class " .
+                                               get_class( $obj ) . "\n";
+                                       ++$numBad;
+                                       continue;
+                               }
+
+                               // Process flags
+                               $flags = explode( ',', $row->old_flags );
+                               if ( in_array( 'utf-8', $flags ) || in_array( 'utf8', $flags ) ) {
+                                       $legacyEncoding = false;
+                               } else {
+                                       $legacyEncoding = true;
+                               }
+
+                               // Queue the stub for future batch processing
+                               $id = intval( $obj->mOldId );
+                               $secondaryIds[] = $id;
+                               $stubs[$row->old_id] = [
+                                       'legacyEncoding' => $legacyEncoding,
+                                       'secondaryId' => $id,
+                                       'hash' => $obj->mHash,
+                               ];
+                       }
+
+                       $secondaryIds = array_unique( $secondaryIds );
+
+                       if ( !count( $secondaryIds ) ) {
+                               continue;
+                       }
+
+                       // Run the batch query on blob_tracking
+                       $res = $dbr->select(
+                               'blob_tracking',
+                               '*',
+                               [
+                                       'bt_text_id' => $secondaryIds,
+                               ],
+                               __METHOD__
+                       );
+                       $trackedBlobs = [];
+                       foreach ( $res as $row ) {
+                               $trackedBlobs[$row->bt_text_id] = $row;
+                       }
+
+                       // Process the stubs
+                       foreach ( $stubs as $primaryId => $stub ) {
+                               $secondaryId = $stub['secondaryId'];
+                               if ( !isset( $trackedBlobs[$secondaryId] ) ) {
+                                       // No tracked blob. Work out what went wrong
+                                       $secondaryRow = $dbr->selectRow(
+                                               'text',
+                                               [ 'old_flags', 'old_text' ],
+                                               [ 'old_id' => $secondaryId ],
+                                               __METHOD__
+                                       );
+                                       if ( !$secondaryRow ) {
+                                               print "$primaryId: unrecoverable: secondary row is missing\n";
+                                               ++$numBad;
+                                       } elseif ( $this->isUnbrokenStub( $stub, $secondaryRow ) ) {
+                                               // Not broken yet, and not in the tracked clusters so it won't get
+                                               // broken by the current RCT run.
+                                               ++$numGood;
+                                       } elseif ( strpos( $secondaryRow->old_flags, 'external' ) !== false ) {
+                                               print "$primaryId: unrecoverable: secondary gone to {$secondaryRow->old_text}\n";
+                                               ++$numBad;
+                                       } else {
+                                               print "$primaryId: unrecoverable: miscellaneous corruption of secondary row\n";
+                                               ++$numBad;
+                                       }
+                                       unset( $stubs[$primaryId] );
+                                       continue;
+                               }
+                               $trackRow = $trackedBlobs[$secondaryId];
+
+                               // Check that the specified text really is available in the tracked source row
+                               $url = "DB://{$trackRow->bt_cluster}/{$trackRow->bt_blob_id}/{$stub['hash']}";
+                               $text = ExternalStore::fetchFromURL( $url );
+                               if ( $text === false ) {
+                                       print "$primaryId: unrecoverable: source text missing\n";
+                                       ++$numBad;
+                                       unset( $stubs[$primaryId] );
+                                       continue;
+                               }
+                               if ( md5( $text ) !== $stub['hash'] ) {
+                                       print "$primaryId: unrecoverable: content hashes do not match\n";
+                                       ++$numBad;
+                                       unset( $stubs[$primaryId] );
+                                       continue;
+                               }
+
+                               // Find the page_id and rev_id
+                               // The page is probably the same as the page of the secondary row
+                               $pageId = intval( $trackRow->bt_page );
+                               if ( !$pageId ) {
+                                       $revId = $pageId = 0;
+                               } else {
+                                       $revId = $this->findTextIdInPage( $pageId, $primaryId );
+                                       if ( !$revId ) {
+                                               // Actually an orphan
+                                               $pageId = $revId = 0;
+                                       }
+                               }
+
+                               $newFlags = $stub['legacyEncoding'] ? 'external' : 'external,utf-8';
+
+                               if ( !$dryRun ) {
+                                       // Reset the text row to point to the original copy
+                                       $this->beginTransaction( $dbw, __METHOD__ );
+                                       $dbw->update(
+                                               'text',
+                                               // SET
+                                               [
+                                                       'old_flags' => $newFlags,
+                                                       'old_text' => $url
+                                               ],
+                                               // WHERE
+                                               [ 'old_id' => $primaryId ],
+                                               __METHOD__
+                                       );
+
+                                       // Add a blob_tracking row so that the new reference can be recompressed
+                                       // without needing to run trackBlobs.php again
+                                       $dbw->insert( 'blob_tracking',
+                                               [
+                                                       'bt_page' => $pageId,
+                                                       'bt_rev_id' => $revId,
+                                                       'bt_text_id' => $primaryId,
+                                                       'bt_cluster' => $trackRow->bt_cluster,
+                                                       'bt_blob_id' => $trackRow->bt_blob_id,
+                                                       'bt_cgz_hash' => $stub['hash'],
+                                                       'bt_new_url' => null,
+                                                       'bt_moved' => 0,
+                                               ],
+                                               __METHOD__
+                                       );
+                                       $this->commitTransaction( $dbw, __METHOD__ );
+                                       $this->waitForSlaves();
+                               }
+
+                               print "$primaryId: resolved to $url\n";
+                               ++$numFixed;
+                       }
+               }
+
+               print "\n";
+               print "Fixed: $numFixed\n";
+               print "Unrecoverable: $numBad\n";
+               print "Good stubs: $numGood\n";
+       }
+
+       function waitForSlaves() {
+               static $iteration = 0;
+               ++$iteration;
+               if ( ++$iteration > 50 == 0 ) {
+                       wfWaitForSlaves();
+                       $iteration = 0;
+               }
+       }
+
+       function findTextIdInPage( $pageId, $textId ) {
+               $ids = $this->getRevTextMap( $pageId );
+               if ( !isset( $ids[$textId] ) ) {
+                       return null;
+               } else {
+                       return $ids[$textId];
+               }
+       }
+
+       function getRevTextMap( $pageId ) {
+               if ( !isset( $this->mapCache[$pageId] ) ) {
+                       // Limit cache size
+                       while ( $this->mapCacheSize > $this->maxMapCacheSize ) {
+                               $key = key( $this->mapCache );
+                               $this->mapCacheSize -= count( $this->mapCache[$key] );
+                               unset( $this->mapCache[$key] );
+                       }
+
+                       $dbr = $this->getDB( DB_REPLICA );
+                       $map = [];
+                       $res = $dbr->select( 'revision',
+                               [ 'rev_id', 'rev_text_id' ],
+                               [ 'rev_page' => $pageId ],
+                               __METHOD__
+                       );
+                       foreach ( $res as $row ) {
+                               $map[$row->rev_text_id] = $row->rev_id;
+                       }
+                       $this->mapCache[$pageId] = $map;
+                       $this->mapCacheSize += count( $map );
+               }
+
+               return $this->mapCache[$pageId];
+       }
+
+       /**
+        * This is based on part of HistoryBlobStub::getText().
+        * Determine if the text can be retrieved from the row in the normal way.
+        * @param array $stub
+        * @param stdClass $secondaryRow
+        * @return bool
+        */
+       function isUnbrokenStub( $stub, $secondaryRow ) {
+               $flags = explode( ',', $secondaryRow->old_flags );
+               $text = $secondaryRow->old_text;
+               if ( in_array( 'external', $flags ) ) {
+                       $url = $text;
+                       MediaWiki\suppressWarnings();
+                       list( /* $proto */, $path ) = explode( '://', $url, 2 );
+                       MediaWiki\restoreWarnings();
+
+                       if ( $path == "" ) {
+                               return false;
+                       }
+                       $text = ExternalStore::fetchFromURL( $url );
+               }
+               if ( !in_array( 'object', $flags ) ) {
+                       return false;
+               }
+
+               if ( in_array( 'gzip', $flags ) ) {
+                       $obj = unserialize( gzinflate( $text ) );
+               } else {
+                       $obj = unserialize( $text );
+               }
+
+               if ( !is_object( $obj ) ) {
+                       // Correct for old double-serialization bug.
+                       $obj = unserialize( $obj );
+               }
+
+               if ( !is_object( $obj ) ) {
+                       return false;
+               }
+
+               $obj->uncompress();
+               $text = $obj->getItem( $stub['hash'] );
+
+               return $text !== false;
+       }
+}
+
+$maintClass = 'FixT22757';
+require_once RUN_MAINTENANCE_IF_MAIN;
index a2dc376..4f22843 100644 (file)
@@ -69,7 +69,7 @@ class TrackBlobs {
                echo "Doing integrity check...\n";
                $dbr = wfGetDB( DB_REPLICA );
 
-               // Scan for HistoryBlobStub objects in the text table (bug 20757)
+               // Scan for HistoryBlobStub objects in the text table (T22757)
 
                $exists = $dbr->selectField( 'text', 1,
                        'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\' ' .
@@ -84,7 +84,7 @@ class TrackBlobs {
                        exit( 1 );
                }
 
-               // Scan the archive table for HistoryBlobStub objects or external flags (bug 22624)
+               // Scan the archive table for HistoryBlobStub objects or external flags (T24624)
                $flags = $dbr->selectField( 'archive', 'ar_flags',
                        'ar_flags LIKE \'%external%\' OR (' .
                        'ar_flags LIKE \'%object%\' ' .
index 2b6ea03..44922a4 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).
@@ -588,7 +594,7 @@ CREATE TABLE /*_*/categorylinks (
   -- conversion algorithm is run.  We store this so that we can update
   -- collations without reparsing all pages.
   -- Note: If you change the length of this field, you also need to change
-  -- code in LinksUpdate.php. See bug 25254.
+  -- code in LinksUpdate.php. See T27254.
   cl_sortkey_prefix varchar(255) binary NOT NULL default '',
 
   -- This isn't really used at present. Provided for an optional
@@ -810,7 +816,7 @@ CREATE TABLE /*_*/ipblocks (
   -- Size chosen to allow IPv6
   -- FIXME: these fields were originally blank for single-IP blocks,
   -- but now they are populated. No migration was ever done. They
-  -- should be fixed to be blank again for such blocks (bug 49504).
+  -- should be fixed to be blank again for such blocks (T51504).
   ipb_range_start tinyblob NOT NULL,
   ipb_range_end tinyblob NOT NULL,
 
index a672e29..d96cecd 100755 (executable)
@@ -112,7 +112,7 @@ class UpdateMediaWiki extends Maintenance {
                }
 
                $lang = Language::factory( 'en' );
-               // Set global language to ensure localised errors are in English (bug 20633)
+               // Set global language to ensure localised errors are in English (T22633)
                RequestContext::getMain()->setLanguage( $lang );
                $wgLang = $lang; // BackCompat
 
@@ -203,7 +203,7 @@ class UpdateMediaWiki extends Maintenance {
 
                # Don't try to access the database
                # This needs to be disabled early since extensions will try to use the l10n
-               # cache from $wgExtensionFunctions (bug 20471)
+               # cache from $wgExtensionFunctions (T22471)
                $wgLocalisationCacheConf = [
                        'class' => 'LocalisationCache',
                        'storeClass' => 'LCStoreNull',
index 9893342..69c9265 100644 (file)
@@ -195,7 +195,7 @@ class UserDupes {
                        "SELECT user_name,COUNT(*) AS n
                                FROM $user
                        GROUP BY user_name
-                         HAVING n > 1", __METHOD__ );
+                               HAVING n > 1", __METHOD__ );
 
                $list = [];
                foreach ( $result as $row ) {
index 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..ea5835d 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 {
 }
 
 .config-plainlink a {
-       background: none !important;
-       padding: 0 !important;
+       background: none !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .config-download-link {
        background-position: left center;
        background-repeat: no-repeat;
        cursor: pointer;
-       font-size: .8em;
+       font-size: 0.8em;
        text-decoration: underline;
        color: #0645ad;
 }
index e415d66..b868295 100644 (file)
     "grunt-eslint": "19.0.0",
     "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 1c16cc3..0c3d27d 100644 (file)
@@ -251,7 +251,6 @@ return [
                'scripts' => 'resources/src/jquery/jquery.highlightText.js',
                'dependencies' => [
                        'mediawiki.RegExp',
-                       'dom-level2-shim',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -345,7 +344,6 @@ return [
                'styles' => 'resources/src/jquery/jquery.tablesorter.less',
                'messages' => [ 'sort-descending', 'sort-ascending' ],
                'dependencies' => [
-                       'dom-level2-shim',
                        'mediawiki.RegExp',
                        'mediawiki.language.months',
                ],
@@ -736,7 +734,7 @@ return [
 
        // Deprecated since MediaWiki 1.29.0
        'json' => [
-               'deprecated' => 'Use of the "json" MediaWiki module is deprecated since MediaWiki 1.29.0',
+               'deprecated' => 'Use of the "json" module is deprecated since MediaWiki 1.29.0',
                'targets' => [ 'desktop', 'mobile' ],
        ],
 
@@ -744,10 +742,12 @@ return [
 
        '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',
@@ -766,6 +766,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',
@@ -780,6 +781,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',
@@ -790,31 +793,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',
@@ -824,6 +839,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',
@@ -919,7 +935,6 @@ return [
        'mediawiki.api.upload' => [
                'scripts' => 'resources/src/mediawiki/api/upload.js',
                'dependencies' => [
-                       'dom-level2-shim',
                        'mediawiki.api',
                        'mediawiki.api.edit',
                ],
@@ -1060,7 +1075,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',
@@ -1203,7 +1217,6 @@ return [
        'mediawiki.Upload' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.Upload.js',
                'dependencies' => [
-                       'dom-level2-shim',
                        'mediawiki.api.upload',
                ],
        ],
@@ -1277,59 +1290,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',
                ],
@@ -1388,9 +1360,10 @@ return [
        'mediawiki.user' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.user.js',
                'dependencies' => [
-                       'mediawiki.cookie',
                        'mediawiki.api',
                        'mediawiki.api.user',
+                       'mediawiki.cookie',
+                       'mediawiki.storage',
                        'user.options',
                        'user.tokens',
                ],
@@ -1461,7 +1434,7 @@ return [
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css',
                'dependencies' => [
                        'jquery.makeCollapsible',
-                       'mediawiki.cookie',
+                       'mediawiki.storage',
                        'mediawiki.icon',
                ],
        ],
@@ -1636,7 +1609,6 @@ return [
                        'mediawiki.util',
                        'mediawiki.language',
                        'user.options',
-                       'dom-level2-shim',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -1775,33 +1747,71 @@ return [
 
        /* MediaWiki Special pages */
 
-       'mediawiki.rcfilters.filters' => [
+       'mediawiki.rcfilters.filters.base.styles' => [
+               'styles' => [
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less',
+               ],
+       ],
+       'mediawiki.rcfilters.filters.dm' => [
                'scripts' => [
                        'resources/src/mediawiki.rcfilters/mw.rcfilters.js',
                        'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.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/mw.rcfilters.Controller.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.less',
+                       '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.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-feedbacklink',
                        'rcfilters-filterlist-noresults',
+                       'rcfilters-filtergroup-registration',
+                       'rcfilters-filter-registered-label',
+                       'rcfilters-filter-registered-description',
+                       'rcfilters-filter-unregistered-label',
+                       'rcfilters-filter-unregistered-description',
                        'rcfilters-filtergroup-authorship',
                        'rcfilters-filter-editsbyself-label',
                        'rcfilters-filter-editsbyself-description',
@@ -1814,10 +1824,37 @@ return [
                        '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',
+                       'rcfilters-highlightmenu-help',
+                       'recentchanges-noresult',
                ],
                'dependencies' => [
                        'oojs-ui',
-                       'mediawiki.Uri',
+                       'mediawiki.rcfilters.filters.dm',
+                       'oojs-ui.styles.icons-moderation',
+                       'oojs-ui.styles.icons-editing-core',
+                       'oojs-ui.styles.icons-editing-styling',
+                       'oojs-ui.styles.icons-interactions',
                ],
        ],
        'mediawiki.special' => [
@@ -1871,8 +1908,11 @@ return [
                        'apisandbox-sending-request',
                        'apisandbox-loading-results',
                        'apisandbox-results-error',
-                       'apisandbox-request-params-json',
+                       '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',
@@ -1891,7 +1931,10 @@ return [
        'mediawiki.special.block' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.block.js',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.block.css',
-               'dependencies' => 'mediawiki.util',
+               'dependencies' => [
+                       'mediawiki.util',
+                       'mediawiki.htmlform',
+               ],
        ],
        'mediawiki.special.changeslist' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.css',
@@ -1968,6 +2011,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',
@@ -1994,6 +2038,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',
        ],
@@ -2378,6 +2439,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',
@@ -2420,11 +2490,10 @@ return [
        ],
 
        /* dom-level2-shim */
-       // IE 8
+       // Deprecated since MediaWiki 1.29.0
        'dom-level2-shim' => [
-               'scripts' => 'resources/src/polyfill-nodeTypes.js',
+               'deprecated' => 'Use of the "dom-level2-shim" module is deprecated since MediaWiki 1.29.0',
                'targets' => [ 'desktop', 'mobile' ],
-               'skipFunction' => 'resources/src/dom-level2-skip.js',
        ],
 
        /* OOjs */
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));
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
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..a84374a
--- /dev/null
@@ -0,0 +1,17 @@
+{
+       "@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": "هيژ جانيایي گولإ ڤورچين نڤابيڌإ",
+       "ooui-selectfile-dragdrop-placeholder": "جانيانأ ڤأنين ايچو"
+}
index 83af863..cbfcab0 100644 (file)
@@ -18,5 +18,9 @@
        "ooui-dialog-process-error": "Un dra bennak a-dreuz a zo bet",
        "ooui-dialog-process-dismiss": "Disteurel",
        "ooui-dialog-process-retry": "Klask en-dro",
-       "ooui-dialog-process-continue": "Kenderc'hel"
+       "ooui-dialog-process-continue": "Kenderc'hel",
+       "ooui-selectfile-button-select": "Diuzañ ur restr",
+       "ooui-selectfile-not-supported": "N'eo ket skoret an diuzañ restroù",
+       "ooui-selectfile-placeholder": "N'eus bet diuzet restr ebet",
+       "ooui-selectfile-dragdrop-placeholder": "Lezel ar restr amañ"
 }
index 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/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 af97d17..722b3e2 100644 (file)
@@ -3,5 +3,21 @@
                "authors": [
                        "Jagwar"
                ]
-       }
+       },
+       "ooui-outline-control-move-down": "Hampidina ilay zavatra",
+       "ooui-outline-control-move-up": "Hampiakatra ilay zavatra",
+       "ooui-outline-control-remove": "Hanala iay zavatra",
+       "ooui-toolbar-more": "Be kokoa",
+       "ooui-toolgroup-expand": "Be kokoa",
+       "ooui-toolgroup-collapse": "Kely kokoa",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Avela",
+       "ooui-dialog-process-error": "Nisy hadisoana nitranga",
+       "ooui-dialog-process-dismiss": "Esorina",
+       "ooui-dialog-process-retry": "Andramana indray",
+       "ooui-dialog-process-continue": "Tohizana",
+       "ooui-selectfile-button-select": "Misafidia rakitra iray",
+       "ooui-selectfile-not-supported": "Tsy zaka ny fisafidiana rakitra",
+       "ooui-selectfile-placeholder": "Tsy misy rakitra voafidy",
+       "ooui-selectfile-dragdrop-placeholder": "Hametraka rakitra eto"
 }
index c8fba3d..e3f3e11 100644 (file)
@@ -7,7 +7,13 @@
        },
        "ooui-outline-control-move-down": "Flytt element ned",
        "ooui-outline-control-move-up": "Flytt element opp",
-       "ooui-toolbar-more": "Fleire",
+       "ooui-toolbar-more": "Meir",
+       "ooui-toolgroup-expand": "Meir",
+       "ooui-toolgroup-collapse": "Færre",
+       "ooui-dialog-message-reject": "Bryt av",
+       "ooui-dialog-process-error": "Noko gjekk gale",
+       "ooui-dialog-process-dismiss": "Lat att",
+       "ooui-dialog-process-continue": "Hald fram",
        "ooui-selectfile-button-select": "Vel ei fil",
        "ooui-selectfile-placeholder": "Inga fil er vald"
 }
index 8bd4be8..386871c 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Saanvel"
+                       "Saanvel",
+                       "Abbas dhothar"
                ]
        },
        "ooui-outline-control-move-down": "شیہ تھلے کرو",
@@ -9,6 +10,7 @@
        "ooui-outline-control-remove": "شیہ مٹاؤ",
        "ooui-toolbar-more": "ہور",
        "ooui-toolgroup-expand": "ہور",
+       "ooui-toolgroup-collapse": "گھٹ",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "مکاؤ",
        "ooui-dialog-process-error": "کوئی رپھڑ پے گیا اے۔",
index 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 f206a72..84048e7 100644 (file)
@@ -18,6 +18,7 @@
        "ooui-dialog-process-dismiss": "צומאַכן",
        "ooui-dialog-process-retry": "פרובירט נאכאמאל",
        "ooui-dialog-process-continue": "פֿארזעצן",
+       "ooui-selectfile-button-select": "קלויבט א טעקע",
        "ooui-selectfile-not-supported": "טעקע אויסווייל נישט געשטיצט",
        "ooui-selectfile-placeholder": "קיין טעקע נישט אויסגעוויילט"
 }
index 556196c..53ce966 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.3
+ * OOjs UI v0.19.5
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-01-04T00:22:40Z
+ * Date: 2017-03-07T22:57:01Z
  */
 ( function ( OO ) {
 
index c36774a..369cf09 100644 (file)
@@ -1,16 +1,15 @@
 /*!
- * OOjs UI v0.18.3
+ * OOjs UI v0.19.5
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-01-04T00:22:45Z
+ * Date: 2017-03-07T22:57:06Z
  */
 .oo-ui-element-hidden {
   display: none !important;
-  /* stylelint-disable-line declaration-no-important */
 }
 .oo-ui-buttonElement {
   display: inline-block;
@@ -19,6 +18,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;
@@ -38,8 +40,8 @@
   cursor: default;
 }
 .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   display: inline-block;
   vertical-align: middle;
 }
@@ -64,7 +66,7 @@
 }
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
-  outline: none;
+  outline: 0;
 }
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-iconElement-icon {
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
   border-color: #aaa;
-  outline: none;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   margin-left: -0.5em;
   margin-right: -0.5em;
+  display: inline-block;
+  vertical-align: middle;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   margin-right: 0.3em;
 .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 {
+  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-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-labelElement-label {
+.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-labelElement-label:empty {
+.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.4;
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-header {
+  max-width: 50em;
 }
 .oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout,
 .oo-ui-fieldsetLayout + .oo-ui-formLayout {
   margin-top: 2em;
 }
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label {
+  display: inline-block;
   font-size: 1.1em;
   margin-bottom: 0.5em;
   padding: 0.25em 0;
   font-weight: bold;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label {
   padding-left: 2em;
   line-height: 1.8em;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-iconElement-icon {
   left: 0;
   top: 0.25em;
 }
-.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget {
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-header > .oo-ui-popupButtonWidget {
   margin-right: 0;
 }
-.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget:last-child {
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-header > .oo-ui-popupButtonWidget:last-child {
   margin-right: 0;
 }
 .oo-ui-formLayout + .oo-ui-fieldsetLayout,
@@ -448,9 +473,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
 }
 .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-  /* Make scrolling smooth */
-  -webkit-transform: translate3d(0, 0, 0);
+  overflow: auto;
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
 }
 .oo-ui-panelLayout-expanded {
   position: absolute;
@@ -463,6 +488,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);
 }
@@ -598,7 +624,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 {
@@ -625,8 +651,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget {
   position: absolute;
-  /* @noflip */
-  left: 0;
 }
 .oo-ui-popupWidget-popup {
   position: relative;
@@ -640,11 +664,49 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
   display: block;
   position: absolute;
-  top: 0;
-  /* @noflip */
-  left: 0;
   background-repeat: no-repeat;
 }
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+  content: '';
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-style: solid;
+  border-color: transparent;
+}
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor {
+  left: 0;
+  /* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after {
+  border-top: 0;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
+  left: 0;
+  /* `bottom` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after {
+  border-bottom: 0;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor {
+  top: 0;
+  /* `left` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:after {
+  border-left: 0;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor {
+  top: 0;
+  /* `right` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:after {
+  border-right: 0;
+}
 .oo-ui-popupWidget-head {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -661,7 +723,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;
@@ -669,31 +733,78 @@ 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-top {
   margin-top: 6px;
 }
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-  content: '';
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-style: solid;
-  border-color: transparent;
-  border-top: 0;
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor {
+  top: -6px;
 }
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before {
   bottom: -7px;
   left: -6px;
   border-bottom-color: #aaa;
   border-width: 7px;
 }
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after {
   bottom: -7px;
   left: -5px;
   border-bottom-color: #fff;
   border-width: 6px;
 }
+.oo-ui-popupWidget-anchored-bottom {
+  margin-bottom: 6px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
+  bottom: -6px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before {
+  top: -7px;
+  left: -6px;
+  border-top-color: #aaa;
+  border-width: 7px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after {
+  top: -7px;
+  left: -5px;
+  border-top-color: #fff;
+  border-width: 6px;
+}
+.oo-ui-popupWidget-anchored-start {
+  margin-left: 6px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor {
+  left: -6px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:before {
+  right: -7px;
+  top: -6px;
+  border-right-color: #aaa;
+  border-width: 7px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:after {
+  right: -7px;
+  top: -5px;
+  border-right-color: #fff;
+  border-width: 6px;
+}
+.oo-ui-popupWidget-anchored-end {
+  margin-right: 6px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor {
+  right: -6px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:before {
+  left: -7px;
+  top: -6px;
+  border-left-color: #aaa;
+  border-width: 7px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:after {
+  left: -7px;
+  top: -5px;
+  border-left-color: #fff;
+  border-width: 6px;
+}
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
   -webkit-transition: width 100ms ease, height 100ms ease, left 100ms ease;
      -moz-transition: width 100ms ease, height 100ms ease, left 100ms ease;
@@ -708,8 +819,11 @@ 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;
@@ -717,13 +831,13 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupButtonWidget .oo-ui-popupWidget {
   cursor: auto;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
-  /* @noflip */
-  left: 0.9375em;
+.oo-ui-popupButtonWidget-frameless-popup.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
+.oo-ui-popupButtonWidget-frameless-popup.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
+  margin-left: 0.9375em;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
-  /* @noflip */
-  left: 1.2375em;
+.oo-ui-popupButtonWidget-framed-popup.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
+.oo-ui-popupButtonWidget-framed-popup.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
+  margin-left: 1.2375em;
 }
 .oo-ui-inputWidget {
   margin-right: 0.5em;
@@ -778,7 +892,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover,
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
   border-color: rgba(0, 0, 0, 0.2);
-  outline: none;
+  outline: 0;
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-disabled select {
   color: #ccc;
@@ -833,14 +947,10 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: none;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator,
-.oo-ui-textInputWidget > .oo-ui-labelElement-label {
+.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
   display: block;
   position: absolute;
   top: 0;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
   height: 100%;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -848,24 +958,21 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
       -ms-user-select: none;
           user-select: none;
 }
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
-  left: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
-.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
-  right: 0;
-}
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator,
-.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-labelElement-label {
+.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
   cursor: text;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-textInputWidget-type-search > .oo-ui-indicatorElement-indicator {
   cursor: pointer;
 }
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+}
 .oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -873,6 +980,26 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
       -ms-user-select: none;
           user-select: none;
 }
+.oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
+  display: block;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
+  left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
+  right: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-labelElement-label {
+  position: absolute;
+  top: 0;
+}
+.oo-ui-textInputWidget-php > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget-php > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget-php > .oo-ui-labelElement-label {
+  pointer-events: none;
+}
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
   padding: 0.5em;
@@ -892,9 +1019,34 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
   background-color: transparent;
 }
+.oo-ui-textInputWidget input::-webkit-input-placeholder,
+.oo-ui-textInputWidget textarea::-webkit-input-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input:-ms-input-placeholder,
+.oo-ui-textInputWidget textarea:-ms-input-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input::-moz-placeholder,
+.oo-ui-textInputWidget textarea::-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input:-moz-placeholder,
+.oo-ui-textInputWidget textarea:-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input::placeholder,
+.oo-ui-textInputWidget textarea::placeholder {
+  color: #72777d;
+  opacity: 1;
+}
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-  outline: none;
+  outline: 0;
   border-color: #a7dcff;
   box-shadow: 0 0 0.3em #a7dcff, 0 0 0 #fff;
 }
@@ -965,6 +1117,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;
 }
@@ -1010,9 +1168,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon,
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
   cursor: pointer;
@@ -1028,20 +1188,18 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-dropdownWidget-handle:hover {
   border-color: rgba(0, 0, 0, 0.2);
 }
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-  top: 0;
-  right: 0;
-  margin: 0.775em;
-}
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-  top: 0;
   left: 0.25em;
-  margin: 0.3em;
+  margin: 0 0.3em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
   line-height: 2.5em;
   margin: 0 0.5em;
 }
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
+}
 .oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
   color: #ccc;
   text-shadow: 0 1px 1px #fff;
@@ -1083,9 +1241,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 {
@@ -1096,8 +1251,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 {
index 68d6413..b041ef4 100644 (file)
@@ -1,16 +1,15 @@
 /*!
- * OOjs UI v0.18.3
+ * OOjs UI v0.19.5
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-01-04T00:22:45Z
+ * Date: 2017-03-07T22:57:06Z
  */
 .oo-ui-element-hidden {
   display: none !important;
-  /* stylelint-disable-line declaration-no-important */
 }
 .oo-ui-buttonElement {
   display: inline-block;
@@ -19,6 +18,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;
@@ -38,8 +40,8 @@
   cursor: default;
 }
 .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   display: inline-block;
   vertical-align: middle;
 }
@@ -61,9 +63,6 @@
 .oo-ui-buttonElement > .oo-ui-buttonElement-button:focus::-moz-focus-inner {
   border-color: transparent;
 }
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-left: 0;
-}
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
   margin-right: 0.25em;
   margin-left: 0.46875em;
   padding-left: 2.4em;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  padding: 0.546875em 1em;
-  min-height: 1.25em;
-  min-width: 1em;
-  border-radius: 2px;
   position: relative;
+  min-height: 2.5em;
+  border-radius: 2px;
+  padding: 0.546875em 1em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button {
+  min-width: 3.125em;
+}
+.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
+  min-width: 0;
 }
 .oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
   line-height: 1.25;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: block;
   position: absolute;
-  top: 0.2em;
+  top: 0;
+  height: 100%;
   left: 0.5625em;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
+  min-height: 3.125em;
+}
+.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.oo-ui-labelElement,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline:first-child {
   margin-top: 0;
 }
-.oo-ui-fieldLayout.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
   padding-bottom: 0.3125em;
+}
+.oo-ui-fieldLayout.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
   line-height: 1.4;
 }
-.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-  padding: 0.3125em 0.46875em;
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-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-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
   width: 35%;
   margin-right: 5%;
+}
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
+  display: block;
   padding-top: 0.3125em;
 }
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help,
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help {
+  margin-right: 0;
+  margin-left: -1.875em;
+}
 .oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
 .oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   width: 60%;
 }
-.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
+  padding: 0.3125em 0.46875em;
+  padding-right: 0;
+}
+.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
   color: #72777d;
 }
 .oo-ui-fieldLayout > .oo-ui-popupButtonWidget {
   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-labelElement-label:empty {
+.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.4;
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-header {
+  max-width: 50em;
 }
 .oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout,
 .oo-ui-fieldsetLayout + .oo-ui-formLayout {
   margin-top: 2em;
 }
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label {
+  display: inline-block;
   margin-bottom: 0.56818em;
   font-size: 1.1em;
   font-weight: bold;
   line-height: 1.4;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label {
   padding-left: 2em;
   line-height: 1.8;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-iconElement-icon {
   top: 0;
   left: 0;
 }
-.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget {
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-header > .oo-ui-popupButtonWidget {
   margin-right: 0;
 }
-.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget:last-child {
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-header > .oo-ui-popupButtonWidget:last-child {
   margin-right: 0;
 }
 .oo-ui-formLayout + .oo-ui-fieldsetLayout,
@@ -587,9 +617,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
 }
 .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-  /* Make scrolling smooth */
-  -webkit-transform: translate3d(0, 0, 0);
+  overflow: auto;
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
 }
 .oo-ui-panelLayout-expanded {
   position: absolute;
@@ -601,10 +631,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;
@@ -625,7 +658,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-right: 0;
 }
 .oo-ui-horizontalLayout > .oo-ui-layout {
-  margin-bottom: 0;
+  margin-top: 0;
 }
 .oo-ui-optionWidget {
   position: relative;
@@ -737,7 +770,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 {
@@ -777,8 +810,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget {
   position: absolute;
-  /* @noflip */
-  left: 0;
 }
 .oo-ui-popupWidget-popup {
   position: relative;
@@ -792,11 +823,49 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
   display: block;
   position: absolute;
-  top: 0;
-  /* @noflip */
-  left: 0;
   background-repeat: no-repeat;
 }
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+  content: '';
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-style: solid;
+  border-color: transparent;
+}
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor {
+  left: 0;
+  /* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after {
+  border-top: 0;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
+  left: 0;
+  /* `bottom` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after {
+  border-bottom: 0;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor {
+  top: 0;
+  /* `left` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:after {
+  border-left: 0;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor {
+  top: 0;
+  /* `right` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:after {
+  border-right: 0;
+}
 .oo-ui-popupWidget-head {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -813,39 +882,88 @@ 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-top {
   margin-top: 9px;
 }
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-  content: '';
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-style: solid;
-  border-color: transparent;
-  border-top: 0;
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor {
+  top: -9px;
 }
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before {
   bottom: -10px;
   left: -9px;
-  border-bottom-color: #888;
+  border-bottom-color: #a2a9b1;
   border-width: 10px;
 }
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after {
   bottom: -10px;
   left: -8px;
   border-bottom-color: #fff;
   border-width: 9px;
 }
+.oo-ui-popupWidget-anchored-bottom {
+  margin-bottom: 9px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
+  bottom: -9px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before {
+  top: -10px;
+  left: -9px;
+  border-top-color: #a2a9b1;
+  border-width: 10px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after {
+  top: -10px;
+  left: -8px;
+  border-top-color: #fff;
+  border-width: 9px;
+}
+.oo-ui-popupWidget-anchored-start {
+  margin-left: 9px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor {
+  left: -9px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:before {
+  right: -10px;
+  top: -9px;
+  border-right-color: #a2a9b1;
+  border-width: 10px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:after {
+  right: -10px;
+  top: -8px;
+  border-right-color: #fff;
+  border-width: 9px;
+}
+.oo-ui-popupWidget-anchored-end {
+  margin-right: 9px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor {
+  right: -9px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:before {
+  left: -10px;
+  top: -9px;
+  border-left-color: #a2a9b1;
+  border-width: 10px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:after {
+  left: -10px;
+  top: -8px;
+  border-left-color: #fff;
+  border-width: 9px;
+}
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
   -webkit-transition: width 100ms, height 100ms, left 100ms;
      -moz-transition: width 100ms, height 100ms, left 100ms;
@@ -860,8 +978,11 @@ 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;
@@ -869,13 +990,13 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupButtonWidget .oo-ui-popupWidget {
   cursor: auto;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
-  /* @noflip */
-  left: 0.9375em;
+.oo-ui-popupButtonWidget-frameless-popup.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
+.oo-ui-popupButtonWidget-frameless-popup.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
+  margin-left: 0.9375em;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
-  /* @noflip */
-  left: 1.5em;
+.oo-ui-popupButtonWidget-framed-popup.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
+.oo-ui-popupButtonWidget-framed-popup.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
+  margin-left: 1.5em;
 }
 .oo-ui-inputWidget {
   margin-right: 0.5em;
@@ -1011,17 +1132,23 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
+.oo-ui-dropdownInputWidget-php {
+  border-right: 1px solid #a2a9b1;
+  border-radius: 2px;
+  overflow-x: hidden;
+}
 .oo-ui-dropdownInputWidget select {
-  background-color: #fff;
-  height: 2.275em;
-  font-size: inherit;
-  font-family: inherit;
+  -webkit-appearance: none;
+     -moz-appearance: none;
+          appearance: none;
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  padding-left: 1em;
+  padding: 0.5em 1em;
+  font-size: inherit;
+  font-family: inherit;
   vertical-align: middle;
 }
 .oo-ui-dropdownInputWidget option {
@@ -1030,14 +1157,42 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   height: 1.5em;
   padding: 0.5em 1em;
 }
-.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover,
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
+  background-color: #f8f9fa;
+  background-position: -9999em 0;
+  background-repeat: no-repeat;
+  color: #222;
+  -webkit-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+     -moz-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+          transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover {
+  background-color: #fff;
+  color: #444;
+  border-color: #a2a9b1;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:active {
+  color: #000;
+  border-color: #72777d;
+}
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
+  border-color: #36c;
   outline: 0;
+  box-shadow: inset 0 0 0 1px #36c;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select::-ms-expand {
+  display: none;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:not( [no-ie] ) {
+  background-position: right 1.75em center;
+  width: calc( 100% + 1em );
+  height: 2.5em;
+  padding: 0 0 0 1em;
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-disabled select {
+  background-color: #eaecf0;
   color: #72777d;
   border-color: #c8ccd1;
-  background-color: #eaecf0;
 }
 .oo-ui-radioInputWidget {
   position: relative;
@@ -1192,14 +1347,10 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: none;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator,
-.oo-ui-textInputWidget > .oo-ui-labelElement-label {
+.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
   display: block;
   position: absolute;
   top: 0;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
   height: 100%;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -1207,24 +1358,21 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
       -ms-user-select: none;
           user-select: none;
 }
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
-  left: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
-.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
-  right: 0;
-}
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator,
-.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-labelElement-label {
+.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
   cursor: text;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-textInputWidget-type-search > .oo-ui-indicatorElement-indicator {
   cursor: pointer;
 }
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+}
 .oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -1232,22 +1380,42 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
       -ms-user-select: none;
           user-select: none;
 }
+.oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
+  display: block;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
+  left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
+  right: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-labelElement-label {
+  position: absolute;
+  top: 0;
+}
+.oo-ui-textInputWidget-php > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget-php > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget-php > .oo-ui-labelElement-label {
+  pointer-events: none;
+}
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
+  margin: 0;
   font-size: inherit;
   font-family: inherit;
   background-color: #fff;
   color: #000;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
+  padding: 0.625em 0.546875em 0.546875em;
 }
 .oo-ui-textInputWidget input {
-  padding: 0.625em 0.546875em 0.546875em;
   line-height: 1.172em;
 }
 .oo-ui-textInputWidget textarea {
-  padding: 0.46875em 0.546875em 0.546875em;
-  line-height: 1.4;
+  line-height: 1.275;
 }
 .oo-ui-textInputWidget .oo-ui-pendingElement-pending {
   background-color: transparent;
@@ -1282,22 +1450,36 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-color: #c8ccd1;
   box-shadow: inset 0 0 0 1px #c8ccd1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled :-moz-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::-webkit-input-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::-webkit-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled ::-moz-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:-ms-input-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:-ms-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled :-ms-input-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::-moz-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled ::-webkit-input-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:-moz-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled :placeholder-shown {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::placeholder {
   color: #72777d;
+  opacity: 1;
+}
+@media screen and (min-width: 0) {
+  .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+    outline: 1px solid #36c;
+    outline-offset: -2px;
+  }
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea {
@@ -1312,50 +1494,51 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   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 {
+  background-color: #eaecf0;
+  color: #72777d;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #c8ccd1;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+  opacity: 0.51;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
+  color: #72777d;
+  text-shadow: 0 1px 1px #fff;
+}
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
-  padding-left: 2.65625em;
+  padding-left: 2.875em;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  max-height: 2.5em;
-  left: 0.46875em;
+  left: 0;
+  max-height: 2.375em;
+  margin-left: 0.5em;
+  background-position: right center;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement input,
 .oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
   padding-right: 2.4875em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  max-height: 2.5em;
-  right: 0.625em;
+  height: 100%;
+  max-height: 2.375em;
+  margin: 0 0.775em;
 }
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
   color: #72777d;
-  right: 0.625em;
-  border: 1px solid transparent;
-  border-width: 1px 0;
-  padding: 0.625em 0 0.546875em;
+  margin-top: 1px;
+  padding: 0.625em 0.546875em 0.546875em;
   line-height: 1.172em;
 }
 .oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
-  right: 2.1875em;
+  margin-right: 2.0875em;
 }
 .oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
-  left: 2.65625em;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
-  background-color: #eaecf0;
-  color: #72777d;
-  text-shadow: 0 1px 1px #fff;
-  border-color: #c8ccd1;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
-  opacity: 0.51;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
-  color: #72777d;
-  text-shadow: 0 1px 1px #fff;
+  margin-left: 2.475em;
 }
 .oo-ui-menuSelectWidget {
   position: absolute;
@@ -1365,7 +1548,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;
@@ -1374,6 +1557,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;
@@ -1431,9 +1620,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon,
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
   cursor: pointer;
@@ -1449,14 +1640,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-radius: 2px;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-  top: 0;
   right: 0;
-  margin: 0.775em;
+  margin: 0 0.775em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-  top: 0;
   left: 0.25em;
-  margin: 0.3em;
+  margin: 0 0.3em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
   margin: 0 1em;
@@ -1538,9 +1727,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 {
@@ -1551,15 +1737,14 @@ 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 {
   pointer-events: none;
 }
-.oo-ui-comboBoxInputWidget input,
-.oo-ui-comboBoxInputWidget textarea {
+.oo-ui-comboBoxInputWidget input {
   height: 2.5em;
   border-top-right-radius: 0;
   border-bottom-right-radius: 0;
@@ -1569,16 +1754,17 @@ 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 {
   border-top-left-radius: 0;
   border-bottom-left-radius: 0;
 }
-.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty input,
-.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty textarea {
+.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty input {
   border-right-width: 1px;
 }
 .oo-ui-comboBoxInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
@@ -1626,7 +1812,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   overflow: hidden;
 }
 .oo-ui-progressBarWidget-bar {
-  background-color: #36c;
   height: 1em;
   -webkit-transition: width 200ms;
      -moz-transition: width 200ms;
@@ -1643,8 +1828,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
           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 {
index 872d81f..f10bdfa 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.3
+ * OOjs UI v0.19.5
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-01-04T00:22:40Z
+ * Date: 2017-03-07T22:57:01Z
  */
 ( 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
@@ -554,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 ) ) {
@@ -792,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.
  *
@@ -1038,6 +1072,73 @@ OO.ui.Element.static.getDimensions = function ( el ) {
        }
 };
 
+/**
+ * Get the number of pixels that an element's content is scrolled to the left.
+ *
+ * Adapted from <https://github.com/othree/jquery.rtl-scroll-type>.
+ * Original code copyright 2012 Wei-Ko Kao, licensed under the MIT License.
+ *
+ * This function smooths out browser inconsistencies (nicely described in the README at
+ * <https://github.com/othree/jquery.rtl-scroll-type>) and produces a result consistent
+ * with Firefox's 'scrollLeft', which seems the sanest.
+ *
+ * @static
+ * @method
+ * @param {HTMLElement|Window} el Element to measure
+ * @return {number} Scroll position from the left.
+ *  If the element's direction is LTR, this is a positive number between `0` (initial scroll position)
+ *  and `el.scrollWidth - el.clientWidth` (furthest possible scroll position).
+ *  If the element's direction is RTL, this is a negative number between `0` (initial scroll position)
+ *  and `-el.scrollWidth + el.clientWidth` (furthest possible scroll position).
+ */
+OO.ui.Element.static.getScrollLeft = ( function () {
+       var rtlScrollType = null;
+
+       function test() {
+               var $definer = $( '<div dir="rtl" style="font-size: 14px; width: 1px; height: 1px; position: absolute; top: -1000px; overflow: scroll">A</div>' ),
+                       definer = $definer[ 0 ];
+
+               $definer.appendTo( 'body' );
+               if ( definer.scrollLeft > 0 ) {
+                       // Safari, Chrome
+                       rtlScrollType = 'default';
+               } else {
+                       definer.scrollLeft = 1;
+                       if ( definer.scrollLeft === 0 ) {
+                               // Firefox, old Opera
+                               rtlScrollType = 'negative';
+                       } else {
+                               // Internet Explorer, Edge
+                               rtlScrollType = 'reverse';
+                       }
+               }
+               $definer.remove();
+       }
+
+       return function getScrollLeft( el ) {
+               var isRoot = el.window === el ||
+                               el === el.ownerDocument.body ||
+                               el === el.ownerDocument.documentElement,
+                       scrollLeft = isRoot ? $( window ).scrollLeft() : el.scrollLeft,
+                       // All browsers use the correct scroll type ('negative') on the root, so don't
+                       // do any fixups when looking at the root element
+                       direction = isRoot ? 'ltr' : $( el ).css( 'direction' );
+
+               if ( direction === 'rtl' ) {
+                       if ( rtlScrollType === null ) {
+                               test();
+                       }
+                       if ( rtlScrollType === 'reverse' ) {
+                               scrollLeft = -scrollLeft;
+                       } else if ( rtlScrollType === 'default' ) {
+                               scrollLeft = scrollLeft - el.scrollWidth + el.clientWidth;
+                       }
+               }
+
+               return scrollLeft;
+       };
+}() );
+
 /**
  * Get scrollable object parent
  *
@@ -1083,7 +1184,8 @@ OO.ui.Element.static.getRootScrollableElement = function ( el ) {
  */
 OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension ) {
        var i, val,
-               // props = [ 'overflow' ] doesn't work due to https://bugzilla.mozilla.org/show_bug.cgi?id=889091
+               // Browsers do not correctly return the computed value of 'overflow' when 'overflow-x' and
+               // 'overflow-y' have different values, so we need to check the separate properties.
                props = [ 'overflow-x', 'overflow-y' ],
                $parent = $( el ).parent();
 
@@ -1098,6 +1200,11 @@ OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension )
                i = props.length;
                while ( i-- ) {
                        val = $parent.css( props[ i ] );
+                       // We assume that elements with 'overflow' (in any direction) set to 'hidden' will never be
+                       // scrolled in that direction, but they can actually be scrolled programatically. The user can
+                       // unintentionally perform a scroll in such case even if the application doesn't scroll
+                       // programatically, e.g. when jumping to an anchor, or when using built-in find functionality.
+                       // This could cause funny issues...
                        if ( val === 'auto' || val === 'scroll' ) {
                                return $parent[ 0 ];
                        }
@@ -1129,6 +1236,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 );
@@ -1297,16 +1407,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 );
 };
 
 /**
@@ -1512,7 +1613,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.
  *
@@ -1595,7 +1696,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 */
 
@@ -1639,6 +1743,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
  *
@@ -2861,16 +2995,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.
  *
@@ -3412,6 +3536,7 @@ OO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.AccessKeyedElement );
 /* Static Properties */
 
 /**
+ * @static
  * @inheritdoc
  */
 OO.ui.ButtonWidget.static.cancelButtonMouseDownEvents = false;
@@ -3646,6 +3771,10 @@ OO.mixinClass( OO.ui.IconWidget, OO.ui.mixin.FlaggedElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.IconWidget.static.tagName = 'span';
 
 /**
@@ -3699,6 +3828,10 @@ OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.mixin.TitledElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.IndicatorWidget.static.tagName = 'span';
 
 /**
@@ -3754,12 +3887,17 @@ 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() );
+               } else {
+                       this.$label.on( 'click', function () {
+                               this.fieldWidget.focus();
+                               return false;
+                       }.bind( this ) );
+               }
        }
-
-       // Initialization
        this.$element.addClass( 'oo-ui-labelWidget' );
 };
 
@@ -3771,20 +3909,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
@@ -3802,6 +3931,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' }
@@ -3919,188 +4049,592 @@ OO.ui.mixin.PendingElement.prototype.popPending = function () {
 };
 
 /**
- * Element that can be automatically clipped to visible boundaries.
+ * Element that will stick adjacent to a specified container, even when it is inserted elsewhere
+ * in the document (for example, in an OO.ui.Window's $overlay).
  *
- * 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 adjacent to
+ * @cfg {string} [verticalPosition='below'] Where to position $floatable vertically:
+ *  'below': Directly below $floatableContainer, aligning f's top edge with fC's bottom edge
+ *  'above': Directly above $floatableContainer, aligning f's bottom edge with fC's top edge
+ *  'top': Align the top edge with $floatableContainer's top edge
+ *  'bottom': Align the bottom edge with $floatableContainer's bottom edge
+ *  'center': Vertically align the center with $floatableContainer's center
+ * @cfg {string} [horizontalPosition='start'] Where to position $floatable horizontally:
+ *  'before': Directly before $floatableContainer, aligning f's end edge with fC's start edge
+ *  'after': Directly after $floatableContainer, algining f's start edge with fC's end edge
+ *  'start': Align the start (left in LTR, right in RTL) edge with $floatableContainer's start edge
+ *  'end': Align the end (right in LTR, left in RTL) edge with $floatableContainer's end edge
+ *  'center': Horizontally align the center with $floatableContainer's center
+ * @cfg {boolean} [hideWhenOutOfView=true] Whether to hide the floatable element if the container
+ *  is out of view
  */
-OO.ui.mixin.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 );
+       this.setVerticalPosition( config.verticalPosition || 'below' );
+       this.setHorizontalPosition( config.horizontalPosition || 'start' );
+       this.hideWhenOutOfView = config.hideWhenOutOfView === undefined ? true : !!config.hideWhenOutOfView;
 };
 
 /* 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 positioned relative to 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.
- *
- * Do not turn clipping on until after the element is attached to the DOM and visible.
+ * Change how the element is positioned vertically.
  *
- * @param {boolean} [clipping] Enable clipping, omit to toggle
- * @chainable
+ * @param {string} position 'below', 'above', 'top', 'bottom' or 'center'
  */
-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: '', 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;
+OO.ui.mixin.FloatableElement.prototype.setVerticalPosition = function ( position ) {
+       if ( [ 'below', 'above', 'top', 'bottom', 'center' ].indexOf( position ) === -1 ) {
+               throw new Error( 'Invalid value for vertical position: ' + position );
+       }
+       if ( this.verticalPosition !== position ) {
+               this.verticalPosition = position;
+               if ( this.$floatable ) {
+                       this.position();
                }
        }
-
-       return this;
 };
 
 /**
- * Check if the element will be clipped to fit the visible area of the nearest scrollable container.
+ * Change how the element is positioned horizontally.
  *
- * @return {boolean} Element will be clipped to the visible area
+ * @param {string} position 'before', 'after', 'start', 'end' or 'center'
  */
-OO.ui.mixin.ClippableElement.prototype.isClipping = function () {
-       return this.clipping;
+OO.ui.mixin.FloatableElement.prototype.setHorizontalPosition = function ( position ) {
+       if ( [ 'before', 'after', 'start', 'end', 'center' ].indexOf( position ) === -1 ) {
+               throw new Error( 'Invalid value for horizontal position: ' + position );
+       }
+       if ( this.horizontalPosition !== position ) {
+               this.horizontalPosition = position;
+               if ( this.$floatable ) {
+                       this.position();
+               }
+       }
 };
 
 /**
- * Check if the bottom or right of the element is being clipped by the nearest scrollable container.
+ * Toggle positioning.
  *
- * @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.
+ * Do not turn positioning on until after the element is attached to the DOM and visible.
  *
- * @return {boolean} Part of the element is being clipped
+ * @param {boolean} [positioning] Enable positioning, omit to toggle
+ * @chainable
  */
-OO.ui.mixin.ClippableElement.prototype.isClippedHorizontally = function () {
-       return this.clippedHorizontally;
-};
+OO.ui.mixin.FloatableElement.prototype.togglePositioning = function ( positioning ) {
+       var closestScrollableOfContainer;
 
-/**
- * Check if the bottom 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.isClippedVertically = function () {
-       return this.clippedVertically;
-};
+       if ( !this.$floatable || !this.$floatableContainer ) {
+               return this;
+       }
 
-/**
- * Set the ideal size. These are the dimensions the element will have when it's not being clipped.
- *
- * @param {number|string} [width] Width as a number of pixels or CSS string with unit suffix
- * @param {number|string} [height] Height as a number of pixels or CSS string with unit suffix
- */
-OO.ui.mixin.ClippableElement.prototype.setIdealSize = function ( width, height ) {
-       this.idealWidth = width;
-       this.idealHeight = height;
+       positioning = positioning === undefined ? !this.positioning : !!positioning;
 
-       if ( !this.clipping ) {
-               // Update dimensions
-               this.$clippable.css( { width: width, height: height } );
+       if ( positioning && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'FloatableElement#togglePositioning: Before calling this method, the element must be attached to the DOM.' );
+               this.warnedUnattached = true;
        }
-       // While clipping, idealWidth and idealHeight are not considered
-};
 
-/**
- * Clip element to visible boundaries and allow scrolling when needed. You should call this method
- * when the element's natural height changes.
- *
- * Element will be clipped the bottom or right of the element is within 10px of the edge of, or
+       if ( this.positioning !== positioning ) {
+               this.positioning = positioning;
+
+               this.needsCustomPosition =
+                       this.verticalPostion !== 'below' ||
+                       this.horizontalPosition !== 'start' ||
+                       !OO.ui.contains( this.$floatableContainer[ 0 ], this.$floatable[ 0 ] );
+
+               closestScrollableOfContainer = OO.ui.Element.static.getClosestScrollableContainer( this.$floatableContainer[ 0 ] );
+               // 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 {
+                       if ( this.$floatableWindow ) {
+                               this.$floatableWindow.off( 'resize', this.onFloatableWindowResizeHandler );
+                               this.$floatableWindow = null;
+                       }
+
+                       if ( this.$floatableClosestScrollable ) {
+                               this.$floatableClosestScrollable.off( 'scroll', this.onFloatableScrollHandler );
+                               this.$floatableClosestScrollable = null;
+                       }
+
+                       this.$floatable.css( { left: '', right: '', top: '' } );
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Check whether the bottom edge of the given element is within the viewport of the given container.
+ *
+ * @private
+ * @param {jQuery} $element
+ * @param {jQuery} $container
+ * @return {boolean}
+ */
+OO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element, $container ) {
+       var elemRect, contRect, topEdgeInBounds, bottomEdgeInBounds, leftEdgeInBounds, rightEdgeInBounds,
+               startEdgeInBounds, endEdgeInBounds,
+               direction = $element.css( 'direction' );
+
+       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();
+       }
+
+       topEdgeInBounds = elemRect.top >= contRect.top && elemRect.top <= contRect.bottom;
+       bottomEdgeInBounds = elemRect.bottom >= contRect.top && elemRect.bottom <= contRect.bottom;
+       leftEdgeInBounds = elemRect.left >= contRect.left && elemRect.left <= contRect.right;
+       rightEdgeInBounds = elemRect.right >= contRect.left && elemRect.right <= contRect.right;
+       if ( direction === 'rtl' ) {
+               startEdgeInBounds = rightEdgeInBounds;
+               endEdgeInBounds = leftEdgeInBounds;
+       } else {
+               startEdgeInBounds = leftEdgeInBounds;
+               endEdgeInBounds = rightEdgeInBounds;
+       }
+
+       if ( this.verticalPosition === 'below' && !bottomEdgeInBounds ) {
+               return false;
+       }
+       if ( this.verticalPosition === 'above' && !topEdgeInBounds ) {
+               return false;
+       }
+       if ( this.horizontalPosition === 'before' && !startEdgeInBounds ) {
+               return false;
+       }
+       if ( this.horizontalPosition === 'after' && !endEdgeInBounds ) {
+               return false;
+       }
+
+       // The other positioning values are all about being inside the container,
+       // so in those cases all we care about is that any part of the container is visible.
+       return elemRect.top <= contRect.bottom && elemRect.bottom >= contRect.top &&
+               elemRect.left <= contRect.right && elemRect.right >= contRect.left;
+};
+
+/**
+ * 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 () {
+       if ( !this.positioning ) {
+               return this;
+       }
+
+       if ( this.hideWhenOutOfView && !this.isElementInViewport( this.$floatableContainer, this.$floatableClosestScrollable ) ) {
+               this.$floatable.addClass( 'oo-ui-element-hidden' );
+               return this;
+       } else {
+               this.$floatable.removeClass( 'oo-ui-element-hidden' );
+       }
+
+       if ( !this.needsCustomPosition ) {
+               return this;
+       }
+
+       this.$floatable.css( this.computePosition() );
+
+       // We updated the position, so re-evaluate the clipping state.
+       // (ClippableElement does not listen to 'scroll' events on $floatableContainer's parent, and so
+       // 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;
+};
+
+/**
+ * Compute how #$floatable should be positioned based on the position of #$floatableContainer
+ * and the positioning settings. This is a helper for #position that shouldn't be called directly,
+ * but may be overridden by subclasses if they want to change or add to the positioning logic.
+ *
+ * @return {Object} New position to apply with .css(). Keys are 'top', 'left', 'bottom' and 'right'.
+ */
+OO.ui.mixin.FloatableElement.prototype.computePosition = function () {
+       var isBody, scrollableX, scrollableY, containerPos,
+               horizScrollbarHeight, vertScrollbarWidth, scrollTop, scrollLeft,
+               newPos = { top: '', left: '', bottom: '', right: '' },
+               direction = this.$floatableContainer.css( 'direction' ),
+               $offsetParent = this.$floatable.offsetParent();
+
+       if ( $offsetParent.is( 'html' ) ) {
+               // The innerHeight/Width and clientHeight/Width calculations don't work well on the
+               // <html> element, but they do work on the <body>
+               $offsetParent = $( $offsetParent[ 0 ].ownerDocument.body );
+       }
+       isBody = $offsetParent.is( 'body' );
+       scrollableX = $offsetParent.css( 'overflow-x' ) === 'scroll' || $offsetParent.css( 'overflow-x' ) === 'auto';
+       scrollableY = $offsetParent.css( 'overflow-y' ) === 'scroll' || $offsetParent.css( 'overflow-y' ) === 'auto';
+
+       vertScrollbarWidth = $offsetParent.innerWidth() - $offsetParent.prop( 'clientWidth' );
+       horizScrollbarHeight = $offsetParent.innerHeight() - $offsetParent.prop( 'clientHeight' );
+       // We don't need to compute and add scrollTop and scrollLeft if the scrollable container is the body,
+       // or if it isn't scrollable
+       scrollTop = scrollableY && !isBody ? $offsetParent.scrollTop() : 0;
+       scrollLeft = scrollableX && !isBody ? OO.ui.Element.static.getScrollLeft( $offsetParent[ 0 ] ) : 0;
+
+       // Avoid passing the <body> to getRelativePosition(), because it won't return what we expect
+       // if the <body> has a margin
+       containerPos = isBody ?
+               this.$floatableContainer.offset() :
+               OO.ui.Element.static.getRelativePosition( this.$floatableContainer, $offsetParent );
+       containerPos.bottom = containerPos.top + this.$floatableContainer.outerHeight();
+       containerPos.right = containerPos.left + this.$floatableContainer.outerWidth();
+       containerPos.start = direction === 'rtl' ? containerPos.right : containerPos.left;
+       containerPos.end = direction === 'rtl' ? containerPos.left : containerPos.right;
+
+       if ( this.verticalPosition === 'below' ) {
+               newPos.top = containerPos.bottom;
+       } else if ( this.verticalPosition === 'above' ) {
+               newPos.bottom = $offsetParent.outerHeight() - containerPos.top;
+       } else if ( this.verticalPosition === 'top' ) {
+               newPos.top = containerPos.top;
+       } else if ( this.verticalPosition === 'bottom' ) {
+               newPos.bottom = $offsetParent.outerHeight() - containerPos.bottom;
+       } else if ( this.verticalPosition === 'center' ) {
+               newPos.top = containerPos.top +
+                       ( this.$floatableContainer.height() - this.$floatable.height() ) / 2;
+       }
+
+       if ( this.horizontalPosition === 'before' ) {
+               newPos.end = containerPos.start;
+       } else if ( this.horizontalPosition === 'after' ) {
+               newPos.start = containerPos.end;
+       } else if ( this.horizontalPosition === 'start' ) {
+               newPos.start = containerPos.start;
+       } else if ( this.horizontalPosition === 'end' ) {
+               newPos.end = containerPos.end;
+       } else if ( this.horizontalPosition === 'center' ) {
+               newPos.left = containerPos.left +
+                       ( this.$floatableContainer.width() - this.$floatable.width() ) / 2;
+       }
+
+       if ( newPos.start !== undefined ) {
+               if ( direction === 'rtl' ) {
+                       newPos.right = ( isBody ? $( $offsetParent[ 0 ].ownerDocument.documentElement ) : $offsetParent ).outerWidth() - newPos.start;
+               } else {
+                       newPos.left = newPos.start;
+               }
+               delete newPos.start;
+       }
+       if ( newPos.end !== undefined ) {
+               if ( direction === 'rtl' ) {
+                       newPos.left = newPos.end;
+               } else {
+                       newPos.right = ( isBody ? $( $offsetParent[ 0 ].ownerDocument.documentElement ) : $offsetParent ).outerWidth() - newPos.end;
+               }
+               delete newPos.end;
+       }
+
+       // Account for scroll position
+       if ( newPos.top !== '' ) {
+               newPos.top += scrollTop;
+       }
+       if ( newPos.bottom !== '' ) {
+               newPos.bottom -= scrollTop;
+       }
+       if ( newPos.left !== '' ) {
+               newPos.left += scrollLeft;
+       }
+       if ( newPos.right !== '' ) {
+               newPos.right -= scrollLeft;
+       }
+
+       // Account for scrollbar gutter
+       if ( newPos.bottom !== '' ) {
+               newPos.bottom -= horizScrollbarHeight;
+       }
+       if ( direction === 'rtl' ) {
+               if ( newPos.left !== '' ) {
+                       newPos.left -= vertScrollbarWidth;
+               }
+       } else {
+               if ( newPos.right !== '' ) {
+                       newPos.right -= vertScrollbarWidth;
+               }
+       }
+
+       return newPos;
+};
+
+/**
+ * Element that can be automatically clipped to visible boundaries.
+ *
+ * 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 ( clipping && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'ClippableElement#toggleClipping: Before calling this method, the element must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+
+       if ( this.clipping !== clipping ) {
+               this.clipping = clipping;
+               if ( clipping ) {
+                       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.
+ *
+ * @return {boolean} Part of the element is being clipped
+ */
+OO.ui.mixin.ClippableElement.prototype.isClippedHorizontally = function () {
+       return this.clippedHorizontally;
+};
+
+/**
+ * Check if the bottom 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.isClippedVertically = function () {
+       return this.clippedVertically;
+};
+
+/**
+ * Set the ideal size. These are the dimensions the element will have when it's not being clipped.
+ *
+ * @param {number|string} [width] Width as a number of pixels or CSS string with unit suffix
+ * @param {number|string} [height] Height as a number of pixels or CSS string with unit suffix
+ */
+OO.ui.mixin.ClippableElement.prototype.setIdealSize = function ( width, height ) {
+       this.idealWidth = width;
+       this.idealHeight = height;
+
+       if ( !this.clipping ) {
+               // Update dimensions
+               this.$clippable.css( { width: width, height: height } );
+       }
+       // While clipping, idealWidth and idealHeight are not considered
+};
+
+/**
+ * Clip element to visible boundaries and allow scrolling when needed. You should call this method
+ * when the element's natural height changes.
+ *
+ * Element will be clipped the bottom or right of the element is within 10px of the edge of, or
  * overlapped by, the visible area of the nearest scrollable container.
  *
  * Because calling clip() when the natural height changes isn't always possible, we also set
@@ -4154,8 +4688,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: ''
                } );
@@ -4167,8 +4704,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: ''
                } );
@@ -4196,6 +4736,8 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
  * By default, each popup has an anchor that points toward its origin.
  * Please see the [OOjs UI documentation on Mediawiki] [1] for more information and examples.
  *
+ * Unlike most widgets, PopupWidget is initially hidden and must be shown by calling #toggle.
+ *
  *     @example
  *     // A popup widget.
  *     var popup = new OO.ui.PopupWidget( {
@@ -4214,19 +4756,31 @@ 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
  * @cfg {number} [width=320] Width of popup in pixels
  * @cfg {number} [height] Height of popup in pixels. Omit to use the automatic height.
  * @cfg {boolean} [anchor=true] Show anchor pointing to origin of popup
- * @cfg {string} [align='center'] Alignment of the popup: `center`, `force-left`, `force-right`, `backwards` or `forwards`.
- *  If the popup is forced-left the popup body is leaning towards the left. For force-right alignment, the body of the
- *  popup is leaning towards the right of the screen.
- *  Using 'backwards' is a logical direction which will result in the popup leaning towards the beginning of the sentence
- *  in the given language, which means it will flip to the correct positioning in right-to-left languages.
- *  Using 'forward' will also result in a logical alignment where the body of the popup leans towards the end of the
- *  sentence in the given language.
+ * @cfg {string} [position='below'] Where to position the popup relative to $floatableContainer
+ *  'above': Put popup above $floatableContainer; anchor points down to the start edge of $floatableContainer
+ *  'below': Put popup below $floatableContainer; anchor points up to the start edge of $floatableContainer
+ *  'before': Put popup to the left (LTR) / right (RTL) of $floatableContainer; anchor points
+ *            endwards (right/left) to the vertical center of $floatableContainer
+ *  'after': Put popup to the right (LTR) / left (RTL) of $floatableContainer; anchor points
+ *            startwards (left/right) to the vertical center of $floatableContainer
+ * @cfg {string} [align='center'] How to align the popup to $floatableContainer
+ *  'forwards': If position is above/below, move the popup as far endwards (right in LTR, left in RTL)
+ *              as possible while still keeping the anchor within the popup;
+ *              if position is before/after, move the popup as far downwards as possible.
+ *  'backwards': If position is above/below, move the popup as far startwards (left in LTR, right in RTL)
+ *               as possible while still keeping the anchor within the popup;
+ *               if position in before/after, move the popup as far upwards as possible.
+ *  'center': Horizontally (if position is above/below) or vertically (before/after) align the center
+ *            of the popup with the center of $floatableContainer.
+ * 'force-left': Alias for 'forwards' in LTR and 'backwards' in RTL
+ * 'force-right': Alias for 'backwards' in RTL and 'forwards' in LTR
  * @cfg {jQuery} [$container] Constrain the popup to the boundaries of the specified container.
  *  See the [OOjs UI docs on MediaWiki][3] for an example.
  *  [3]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Popups#containerExample
@@ -4259,6 +4813,7 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
                $clippable: this.$body,
                $clippableContainer: this.$popup
        } ) );
+       OO.ui.mixin.FloatableElement.call( this, config );
 
        // Properties
        this.$anchor = $( '<div>' );
@@ -4268,15 +4823,16 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
        this.autoClose = !!config.autoClose;
        this.$autoCloseIgnore = config.$autoCloseIgnore;
        this.transitionTimeout = null;
-       this.anchor = null;
+       this.anchored = false;
        this.width = config.width !== undefined ? config.width : 320;
        this.height = config.height !== undefined ? config.height : null;
-       this.setAlignment( config.align );
        this.onMouseDownHandler = this.onMouseDown.bind( this );
        this.onDocumentKeyDownHandler = this.onDocumentKeyDown.bind( this );
 
        // Initialization
        this.toggleAnchor( config.anchor === undefined || config.anchor );
+       this.setAlignment( config.align || 'center' );
+       this.setPosition( config.position || 'below' );
        this.$body.addClass( 'oo-ui-popupWidget-body' );
        this.$anchor.addClass( 'oo-ui-popupWidget-anchor' );
        this.$popup
@@ -4323,6 +4879,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 */
 
@@ -4423,6 +4980,21 @@ OO.ui.PopupWidget.prototype.toggleAnchor = function ( show ) {
                this.anchored = show;
        }
 };
+/**
+ * Change which edge the anchor appears on.
+ *
+ * @param {string} edge 'top', 'bottom', 'start' or 'end'
+ */
+OO.ui.PopupWidget.prototype.setAnchorEdge = function ( edge ) {
+       if ( [ 'top', 'bottom', 'start', 'end' ].indexOf( edge ) === -1 ) {
+               throw new Error( 'Invalid value for edge: ' + edge );
+       }
+       if ( this.anchorEdge !== null ) {
+               this.$element.removeClass( 'oo-ui-popupWidget-anchored-' + this.anchorEdge );
+       }
+       this.anchorEdge = edge;
+       this.$element.addClass( 'oo-ui-popupWidget-anchored-' + edge );
+};
 
 /**
  * Check if the anchor is visible.
@@ -4430,10 +5002,18 @@ OO.ui.PopupWidget.prototype.toggleAnchor = function ( show ) {
  * @return {boolean} Anchor is visible
  */
 OO.ui.PopupWidget.prototype.hasAnchor = function () {
-       return this.anchor;
+       return this.anchored;
 };
 
 /**
+ * Toggle visibility of the popup. The popup is initially hidden and must be shown by calling
+ * `.toggle( true )` after its #$element is attached to the DOM.
+ *
+ * Do not show the popup while it is not attached to the DOM. The calculations required to display
+ * it in the right place and with the right dimensions only work correctly while it is attached.
+ * Side-effects may include broken interface and exceptions being thrown. This wasn't always
+ * strictly enforced, so currently it only generates a warning in the browser console.
+ *
  * @inheritdoc
  */
 OO.ui.PopupWidget.prototype.toggle = function ( show ) {
@@ -4442,10 +5022,21 @@ OO.ui.PopupWidget.prototype.toggle = function ( show ) {
 
        change = show !== this.isVisible();
 
+       if ( show && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'PopupWidget#toggle: Before calling this method, the popup must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+       if ( show && !this.$floatableContainer && this.isElementAttached() ) {
+               // Fall back to the parent node if the floatableContainer is not set
+               this.setFloatableContainer( this.$element.parent() );
+       }
+
        // Parent method
        OO.ui.PopupWidget.parent.prototype.toggle.call( this, show );
 
        if ( change ) {
+               this.togglePositioning( show && !!this.$floatableContainer );
+
                if ( show ) {
                        if ( this.autoClose ) {
                                this.bindMouseDownListener();
@@ -4493,62 +5084,7 @@ OO.ui.PopupWidget.prototype.setSize = function ( width, height, transition ) {
  * @chainable
  */
 OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
-       var popupOffset, originOffset, containerLeft, containerWidth, containerRight,
-               popupLeft, popupRight, overlapLeft, overlapRight, anchorWidth,
-               align = this.align,
-               widget = this;
-
-       if ( !this.$container ) {
-               // Lazy-initialize $container if not specified in constructor
-               this.$container = $( this.getClosestScrollableElementContainer() );
-       }
-
-       // Set height and width before measuring things, since it might cause our measurements
-       // to change (e.g. due to scrollbars appearing or disappearing)
-       this.$popup.css( {
-               width: this.width,
-               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 ];
-
-       // 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;
-       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;
-       } else if ( overlapLeft < 0 ) {
-               popupOffset -= overlapLeft;
-       }
-
-       // Adjust offset to avoid anchor being rendered too close to the edge
-       // $anchor.width() doesn't work with the pure CSS anchor (returns 0)
-       // TODO: Find a measurement that works for CSS anchors and image anchors
-       anchorWidth = this.$anchor[ 0 ].scrollWidth * 2;
-       if ( popupOffset + this.width < anchorWidth ) {
-               popupOffset = anchorWidth - this.width;
-       } else if ( -popupOffset < anchorWidth ) {
-               popupOffset = -anchorWidth;
-       }
+       var widget = this;
 
        // Prevent transition from being interrupted
        clearTimeout( this.transitionTimeout );
@@ -4557,8 +5093,7 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
                this.$element.addClass( 'oo-ui-popupWidget-transitioning' );
        }
 
-       // Position body relative to anchor
-       this.$popup.css( 'margin-left', popupOffset );
+       this.position();
 
        if ( transition ) {
                // Prevent transitioning after transition is complete
@@ -4569,38 +5104,196 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
                // Prevent transitioning immediately
                this.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
        }
+};
 
-       // Reevaluate clipping state since we've relocated and resized the popup
-       this.clip();
+/**
+ * @inheritdoc
+ */
+OO.ui.PopupWidget.prototype.computePosition = function () {
+       var direction, align, vertical, start, end, near, far, sizeProp, popupSize, anchorSize, anchorPos,
+               anchorOffset, anchorMargin, parentPosition, positionProp, positionAdjustment, floatablePos,
+               offsetParentPos, containerPos,
+               popupPos = {},
+               anchorCss = { left: '', right: '', top: '', bottom: '' },
+               alignMap = {
+                       ltr: {
+                               'force-left': 'backwards',
+                               'force-right': 'forwards'
+                       },
+                       rtl: {
+                               'force-left': 'forwards',
+                               'force-right': 'backwards'
+                       }
+               },
+               anchorEdgeMap = {
+                       above: 'bottom',
+                       below: 'top',
+                       before: 'end',
+                       after: 'start'
+               },
+               hPosMap = {
+                       forwards: 'start',
+                       center: 'center',
+                       backwards: 'before'
+               },
+               vPosMap = {
+                       forwards: 'top',
+                       center: 'center',
+                       backwards: 'bottom'
+               };
 
-       return this;
+       if ( !this.$container ) {
+               // Lazy-initialize $container if not specified in constructor
+               this.$container = $( this.getClosestScrollableElementContainer() );
+       }
+       direction = this.$container.css( 'direction' );
+
+       // Set height and width before we do anything else, since it might cause our measurements
+       // to change (e.g. due to scrollbars appearing or disappearing), and it also affects centering
+       this.$popup.css( {
+               width: this.width,
+               height: this.height !== null ? this.height : 'auto'
+       } );
+
+       align = alignMap[ direction ][ this.align ] || this.align;
+       // If the popup is positioned before or after, then the anchor positioning is vertical, otherwise horizontal
+       vertical = this.popupPosition === 'before' || this.popupPosition === 'after';
+       start = vertical ? 'top' : ( direction === 'rtl' ? 'right' : 'left' );
+       end = vertical ? 'bottom' : ( direction === 'rtl' ? 'left' : 'right' );
+       near = vertical ? 'top' : 'left';
+       far = vertical ? 'bottom' : 'right';
+       sizeProp = vertical ? 'Height' : 'Width';
+       popupSize = vertical ? ( this.height || this.$popup.height() ) : this.width;
+
+       this.setAnchorEdge( anchorEdgeMap[ this.popupPosition ] );
+       this.horizontalPosition = vertical ? this.popupPosition : hPosMap[ align ];
+       this.verticalPosition = vertical ? vPosMap[ align ] : this.popupPosition;
+
+       // Parent method
+       parentPosition = OO.ui.mixin.FloatableElement.prototype.computePosition.call( this );
+       // Find out which property FloatableElement used for positioning, and adjust that value
+       positionProp = vertical ?
+               ( parentPosition.top !== '' ? 'top' : 'bottom' ) :
+               ( parentPosition.left !== '' ? 'left' : 'right' );
+
+       // Figure out where the near and far edges of the popup and $floatableContainer are
+       floatablePos = this.$floatableContainer.offset();
+       floatablePos[ far ] = floatablePos[ near ] + this.$floatableContainer[ 'outer' + sizeProp ]();
+       // Measure where the offsetParent is and compute our position based on that and parentPosition
+       offsetParentPos = this.$element.offsetParent().offset();
+
+       if ( positionProp === near ) {
+               popupPos[ near ] = offsetParentPos[ near ] + parentPosition[ near ];
+               popupPos[ far ] = popupPos[ near ] + popupSize;
+       } else {
+               popupPos[ far ] = offsetParentPos[ near ] +
+                       this.$element.offsetParent()[ 'inner' + sizeProp ]() - parentPosition[ far ];
+               popupPos[ near ] = popupPos[ far ] - popupSize;
+       }
+
+       // Position the anchor (which is positioned relative to the popup) to point to $floatableContainer
+       // For popups above/below, we point to the start edge; for popups before/after, we point to the center
+       anchorPos = vertical ? ( floatablePos[ start ] + floatablePos[ end ] ) / 2 : floatablePos[ start ];
+       anchorOffset = ( start === far ? -1 : 1 ) * ( anchorPos - popupPos[ start ] );
+
+       // If the anchor is less than 2*anchorSize from either edge, move the popup to make more space
+       // this.$anchor.width()/height() returns 0 because of the CSS trickery we use, so use scrollWidth/Height
+       anchorSize = this.$anchor[ 0 ][ 'scroll' + sizeProp ];
+       anchorMargin = parseFloat( this.$anchor.css( 'margin-' + start ) );
+       if ( anchorOffset + anchorMargin < 2 * anchorSize ) {
+               // Not enough space for the anchor on the start side; pull the popup startwards
+               positionAdjustment = ( positionProp === start ? -1 : 1 ) *
+                       ( 2 * anchorSize - ( anchorOffset + anchorMargin ) );
+       } else if ( anchorOffset + anchorMargin > popupSize - 2 * anchorSize ) {
+               // Not enough space for the anchor on the end side; pull the popup endwards
+               positionAdjustment = ( positionProp === end ? -1 : 1 ) *
+                       ( anchorOffset + anchorMargin - ( popupSize - 2 * anchorSize ) );
+       } else {
+               positionAdjustment = 0;
+       }
+
+       // Check if the popup will go beyond the edge of this.$container
+       containerPos = this.$container.offset();
+       containerPos[ far ] = containerPos[ near ] + this.$container[ 'inner' + sizeProp ]();
+       // Take into account how much the popup will move because of the adjustments we're going to make
+       popupPos[ near ] += ( positionProp === near ? 1 : -1 ) * positionAdjustment;
+       popupPos[ far ] += ( positionProp === near ? 1 : -1 ) * positionAdjustment;
+       if ( containerPos[ near ] + this.containerPadding > popupPos[ near ] ) {
+               // Popup goes beyond the near (left/top) edge, move it to the right/bottom
+               positionAdjustment += ( positionProp === near ? 1 : -1 ) *
+                       ( containerPos[ near ] + this.containerPadding - popupPos[ near ] );
+       } else if ( containerPos[ far ] - this.containerPadding < popupPos[ far ] ) {
+               // Popup goes beyond the far (right/bottom) edge, move it to the left/top
+               positionAdjustment += ( positionProp === far ? 1 : -1 ) *
+                       ( popupPos[ far ] - ( containerPos[ far ] - this.containerPadding ) );
+       }
+
+       // Adjust anchorOffset for positionAdjustment
+       anchorOffset += ( positionProp === start ? -1 : 1 ) * positionAdjustment;
+
+       // Position the anchor
+       anchorCss[ start ] = anchorOffset;
+       this.$anchor.css( anchorCss );
+       // Move the popup if needed
+       parentPosition[ positionProp ] += positionAdjustment;
+
+       return parentPosition;
 };
 
 /**
  * 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';
        }
+       this.position();
 };
 
 /**
  * Get popup alignment
  *
- * @return {string} align Alignment of the popup, `center`, `force-left`, `force-right`,
+ * @return {string} Alignment of the popup, `center`, `force-left`, `force-right`,
  *  `backwards` or `forwards`.
  */
 OO.ui.PopupWidget.prototype.getAlignment = function () {
        return this.align;
 };
 
+/**
+ * Change the positioning of the popup.
+ *
+ * @param {string} position 'above', 'below', 'before' or 'after'
+ */
+OO.ui.PopupWidget.prototype.setPosition = function ( position ) {
+       if ( [ 'above', 'below', 'before', 'after' ].indexOf( position ) === -1 ) {
+               position = 'below';
+       }
+       this.popupPosition = position;
+       this.position();
+};
+
+/**
+ * Get popup positioning.
+ *
+ * @return {string} 'above', 'below', 'before' or 'after'
+ */
+OO.ui.PopupWidget.prototype.getPosition = function () {
+       return this.popupPosition;
+};
+
 /**
  * PopupElement is mixed into other classes to generate a {@link OO.ui.PopupWidget popup widget}.
  * A popup is a container for content. It is overlaid and positioned absolutely. By default, each
@@ -4621,9 +5314,14 @@ OO.ui.mixin.PopupElement = function OoUiMixinPopupElement( config ) {
 
        // Properties
        this.popup = new OO.ui.PopupWidget( $.extend(
-               { autoClose: true },
+               {
+                       autoClose: true,
+                       $floatableContainer: this.$element
+               },
                config.popup,
-               { $autoCloseIgnore: this.$element.add( config.popup && config.popup.$autoCloseIgnore ) }
+               {
+                       $autoCloseIgnore: this.$element.add( config.popup && config.popup.$autoCloseIgnore )
+               }
        ) );
 };
 
@@ -4662,6 +5360,9 @@ 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
@@ -4670,14 +5371,21 @@ OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
        // Mixin constructors
        OO.ui.mixin.PopupElement.call( this, config );
 
+       // Properties
+       this.$overlay = config.$overlay || this.$element;
+
        // Events
        this.connect( this, { click: 'onAction' } );
 
        // 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 */
@@ -4851,12 +5559,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 */
@@ -4979,6 +5715,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},
@@ -5423,7 +6172,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;
@@ -5438,14 +6187,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();
+               var matchText = item.getMatchText();
+               if ( matchText.normalize ) {
+                       matchText = matchText.normalize();
                }
-               if ( l.normalize ) {
-                       l = l.normalize();
-               }
-               return re.test( l );
+               return re.test( matchText );
        };
 };
 
@@ -5929,6 +6675,10 @@ OO.inheritClass( OO.ui.MenuOptionWidget, OO.ui.DecoratedOptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MenuOptionWidget.static.scrollIntoViewOnSelect = true;
 
 /**
@@ -5982,8 +6732,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;
 
 /**
@@ -6004,6 +6762,8 @@ OO.ui.MenuSectionOptionWidget.static.highlightable = false;
  * - Down-arrow key: highlight the next menu option
  * - Esc key: hide the menu
  *
+ * Unlike most widgets, MenuSelectWidget is initially hidden and must be shown by calling #toggle.
+ *
  * Please see the [OOjs UI documentation on MediaWiki][1] for more information.
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options
  *
@@ -6023,6 +6783,7 @@ OO.ui.MenuSectionOptionWidget.static.highlightable = false;
  *  that toggles the menu's visibility on click, the menu will be hidden then re-shown when the user clicks
  *  that button, unless the button (or its parent widget) is passed in here.
  * @cfg {boolean} [autoHide=true] Hide the menu when the mouse is pressed outside the menu.
+ * @cfg {boolean} [hideOnChoose=true] Hide the menu when the user chooses an option.
  * @cfg {boolean} [filterFromInput=false] Filter the displayed options from the input
  */
 OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
@@ -6037,6 +6798,7 @@ OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
 
        // Properties
        this.autoHide = config.autoHide === undefined || !!config.autoHide;
+       this.hideOnChoose = config.hideOnChoose === undefined || !!config.hideOnChoose;
        this.filterFromInput = !!config.filterFromInput;
        this.$input = config.$input ? config.$input : config.input ? config.input.$input : null;
        this.$widget = config.widget ? config.widget.$element : null;
@@ -6117,17 +6879,36 @@ OO.ui.MenuSelectWidget.prototype.onKeyDown = function ( e ) {
  * @protected
  */
 OO.ui.MenuSelectWidget.prototype.updateItemVisibility = function () {
-       var i, item,
+       var i, item, visible, section, sectionEmpty,
+               anyVisible = false,
                len = this.items.length,
                showAll = !this.isVisible(),
                filter = showAll ? null : this.getItemMatcher( this.$input.val() );
 
+       // Hide non-matching options, and also hide section headers if all options
+       // in their section are hidden.
        for ( i = 0; i < len; i++ ) {
                item = this.items[ i ];
-               if ( item instanceof OO.ui.OptionWidget ) {
-                       item.toggle( showAll || filter( item ) );
+               if ( item instanceof OO.ui.MenuSectionOptionWidget ) {
+                       if ( section ) {
+                               // If the previous section was empty, hide its header
+                               section.toggle( showAll || !sectionEmpty );
+                       }
+                       section = item;
+                       sectionEmpty = true;
+               } else if ( item instanceof OO.ui.OptionWidget ) {
+                       visible = showAll || filter( item );
+                       anyVisible = anyVisible || visible;
+                       sectionEmpty = sectionEmpty && !visible;
+                       item.toggle( visible );
                }
        }
+       // Process the final section
+       if ( section ) {
+               section.toggle( showAll || !sectionEmpty );
+       }
+
+       this.$element.toggleClass( 'oo-ui-menuSelectWidget-invisible', !anyVisible );
 
        // Reevaluate clipping
        this.clip();
@@ -6185,7 +6966,7 @@ OO.ui.MenuSelectWidget.prototype.unbindKeyPressListener = function () {
 /**
  * Choose an item.
  *
- * When a user chooses an item, the menu is closed.
+ * When a user chooses an item, the menu is closed, unless the hideOnChoose config option is set to false.
  *
  * Note that ‘choose’ should never be modified programmatically. A user can choose an option with the keyboard
  * or mouse and it becomes selected. To select an item programmatically, use the #selectItem method.
@@ -6195,7 +6976,9 @@ OO.ui.MenuSelectWidget.prototype.unbindKeyPressListener = function () {
  */
 OO.ui.MenuSelectWidget.prototype.chooseItem = function ( item ) {
        OO.ui.MenuSelectWidget.parent.prototype.chooseItem.call( this, item );
-       this.toggle( false );
+       if ( this.hideOnChoose ) {
+               this.toggle( false );
+       }
        return this;
 };
 
@@ -6239,6 +7022,14 @@ OO.ui.MenuSelectWidget.prototype.clearItems = function () {
 };
 
 /**
+ * Toggle visibility of the menu. The menu is initially hidden and must be shown by calling
+ * `.toggle( true )` after its #$element is attached to the DOM.
+ *
+ * Do not show the menu while it is not attached to the DOM. The calculations required to display
+ * it in the right place and with the right dimensions only work correctly while it is attached.
+ * Side-effects may include broken interface and exceptions being thrown. This wasn't always
+ * strictly enforced, so currently it only generates a warning in the browser console.
+ *
  * @inheritdoc
  */
 OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
@@ -6247,6 +7038,11 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
        visible = ( visible === undefined ? !this.visible : !!visible ) && !!this.items.length;
        change = visible !== this.isVisible();
 
+       if ( visible && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'MenuSelectWidget#toggle: Before calling this method, the menu must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+
        // Parent method
        OO.ui.MenuSelectWidget.parent.prototype.toggle.call( this, visible );
 
@@ -6281,7 +7077,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
@@ -6511,12 +7307,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 */
@@ -6552,7 +7364,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
@@ -6846,6 +7658,10 @@ OO.inheritClass( OO.ui.CheckboxMultioptionWidget, OO.ui.MultioptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.CheckboxMultioptionWidget.static.tagName = 'label';
 
 /* Methods */
@@ -6913,7 +7729,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
@@ -6941,315 +7757,108 @@ OO.ui.CheckboxMultioptionWidget.prototype.onKeyDown = function ( e ) {
  * @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
+ * @param {Object} [config] Configuration options
  */
-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 );
-               }
+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-element-hidden' );
-               return;
-       } else {
-               this.$floatable.removeClass( 'oo-ui-element-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;
 };
 
 /**
@@ -7304,9 +7913,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 */
 
 /**
@@ -7333,6 +7939,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:
@@ -7399,6 +8022,10 @@ OO.inheritClass( OO.ui.ProgressBarWidget, OO.ui.Widget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.ProgressBarWidget.static.tagName = 'div';
 
 /* Methods */
@@ -7500,6 +8127,10 @@ OO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.AccessKeyedElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.InputWidget.static.supportsSimpleLabel = true;
 
 /* Static Methods */
@@ -7553,6 +8184,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.
  *
@@ -7641,6 +8291,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();
@@ -7772,6 +8423,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;
 
@@ -7835,7 +8489,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
@@ -7966,7 +8620,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.
  *
@@ -8128,7 +8782,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
@@ -8243,7 +8897,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.
  *
@@ -8295,6 +8949,10 @@ OO.inheritClass( OO.ui.RadioSelectInputWidget, OO.ui.InputWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.RadioSelectInputWidget.static.supportsSimpleLabel = false;
 
 /* Static Methods */
@@ -8418,7 +9076,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
@@ -8450,6 +9108,10 @@ OO.inheritClass( OO.ui.CheckboxMultiselectInputWidget, OO.ui.InputWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.CheckboxMultiselectInputWidget.static.supportsSimpleLabel = false;
 
 /* Static Methods */
@@ -8543,7 +9205,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 ) {
@@ -8553,12 +9215,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 );
@@ -8581,7 +9245,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
@@ -8618,7 +9282,7 @@ OO.ui.CheckboxMultiselectInputWidget.prototype.setOptions = function ( options )
  *  specifies minimum number of rows to display.
  * @cfg {boolean} [autosize=false] Automatically resize the text input to fit its content.
  *  Use the #maxRows config to specify a maximum number of displayed rows.
- * @cfg {boolean} [maxRows] Maximum number of rows to display when #autosize is set to true.
+ * @cfg {number} [maxRows] Maximum number of rows to display when #autosize is set to true.
  *  Defaults to the maximum of `10` and `2 * rows`, or `10` if `rows` isn't provided.
  * @cfg {string} [labelPosition='after'] The position of the inline label relative to that of
  *  the value or placeholder text: `'before'` or `'after'`
@@ -9347,6 +10011,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 ) ) {
@@ -9565,39 +10238,44 @@ 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.
+ * After the user chooses an option, its `data` will be used as a new value for the widget.
+ * A `label` also can be specified for each option: if given, it will be shown instead of the
+ * `data` in the dropdown menu.
+ *
+ * This widget can be used inside an HTML form, such as a OO.ui.FormLayout.
  *
  * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].
  *
  *     @example
  *     // Example: A ComboBoxInputWidget.
  *     var comboBox = new OO.ui.ComboBoxInputWidget( {
- *         label: 'ComboBoxInputWidget',
  *         value: 'Option 1',
- *         menu: {
- *             items: [
- *                 new OO.ui.MenuOptionWidget( {
- *                     data: 'Option 1',
- *                     label: 'Option One'
- *                 } ),
- *                 new OO.ui.MenuOptionWidget( {
- *                     data: 'Option 2',
- *                     label: 'Option Two'
- *                 } ),
- *                 new OO.ui.MenuOptionWidget( {
- *                     data: 'Option 3',
- *                     label: 'Option Three'
- *                 } ),
- *                 new OO.ui.MenuOptionWidget( {
- *                     data: 'Option 4',
- *                     label: 'Option Four'
- *                 } ),
- *                 new OO.ui.MenuOptionWidget( {
- *                     data: 'Option 5',
- *                     label: 'Option Five'
- *                 } )
- *             ]
- *         }
+ *         options: [
+ *             { data: 'Option 1' },
+ *             { data: 'Option 2' },
+ *             { data: 'Option 3' }
+ *         ]
+ *     } );
+ *     $( 'body' ).append( comboBox.$element );
+ *
+ *     @example
+ *     // Example: A ComboBoxInputWidget with additional option labels.
+ *     var comboBox = new OO.ui.ComboBoxInputWidget( {
+ *         value: 'Option 1',
+ *         options: [
+ *             {
+ *                 data: 'Option 1',
+ *                 label: 'Option One'
+ *             },
+ *             {
+ *                 data: 'Option 2',
+ *                 label: 'Option Two'
+ *             },
+ *             {
+ *                 data: 'Option 3',
+ *                 label: 'Option Three'
+ *             }
+ *         ]
  *     } );
  *     $( 'body' ).append( comboBox.$element );
  *
@@ -9837,12 +10515,11 @@ OO.ui.ComboBoxInputWidget.prototype.setOptions = function ( options ) {
  * @cfg {string|OO.ui.HtmlSnippet} [help] Help text. When help text is specified, a "help" icon will appear
  *  in the upper-right corner of the rendered field; clicking it will display the text in a popup.
  *  For important messages, you are advised to use `notices`, as they are always shown.
+ * @cfg {jQuery} [$overlay] Passed to OO.ui.PopupButtonWidget for help popup, if `help` is given.
  *
  * @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;
@@ -9854,8 +10531,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 );
 
@@ -9863,7 +10538,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
@@ -9872,41 +10549,49 @@ 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( {
+                       $overlay: config.$overlay,
+                       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() );
+               } else {
+                       this.$label.on( 'click', function () {
+                               this.fieldWidget.focus();
+                               return false;
+                       }.bind( this ) );
+               }
+       }
        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' )
@@ -9935,17 +10620,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.
  *
@@ -9992,10 +10666,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
@@ -10185,10 +10864,9 @@ OO.inheritClass( OO.ui.ActionFieldLayout, OO.ui.FieldLayout );
  * @cfg {string|OO.ui.HtmlSnippet} [help] Help text. When help text is specified, a "help" icon will appear
  *  in the upper-right corner of the rendered field; clicking it will display the text in a popup.
  *  For important messages, you are advised to use `notices`, as they are always shown.
+ * @cfg {jQuery} [$overlay] Passed to OO.ui.PopupButtonWidget for help popup, if `help` is given.
  */
 OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
-       var $div;
-
        // Configuration initialization
        config = config || {};
 
@@ -10200,32 +10878,36 @@ OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
        OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, { $label: $( '<div>' ) } ) );
        OO.ui.mixin.GroupElement.call( this, config );
 
+       // Properties
+       this.$header = $( '<div>' );
        if ( config.help ) {
                this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+                       $overlay: config.$overlay,
+                       popup: {
+                               padded: true
+                       },
                        classes: [ 'oo-ui-fieldsetLayout-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-fieldsetLayout-help-content' )
-               );
                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 );
        }
@@ -10240,6 +10922,10 @@ OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.mixin.GroupElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.FieldsetLayout.static.tagName = 'fieldset';
 
 /**
@@ -10353,6 +11039,10 @@ OO.mixinClass( OO.ui.FormLayout, OO.ui.mixin.GroupElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.FormLayout.static.tagName = 'form';
 
 /* Methods */
index c2ea652..7b1c099 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.3
+ * OOjs UI v0.19.5
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-01-04T00:22:40Z
+ * Date: 2017-03-07T22:57:01Z
  */
 ( function ( OO ) {
 
index a367301..7604589 100644 (file)
@@ -1,19 +1,19 @@
 /*!
- * OOjs UI v0.18.3
+ * OOjs UI v0.19.5
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-01-04T00:22:45Z
+ * Date: 2017-03-07T22:57:06Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
   z-index: 4;
 }
-.oo-ui-popupTool .oo-ui-popupWidget {
-  /* @noflip */
+.oo-ui-popupTool .oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
+.oo-ui-popupTool .oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
   margin-left: 1.25em;
 }
 .oo-ui-toolGroupTool > .oo-ui-popupToolGroup {
   -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 0610822..ad1746d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.3
+ * OOjs UI v0.19.5
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-01-04T00:22:45Z
+ * Date: 2017-03-07T22:57:06Z
  */
 .oo-ui-tool.oo-ui-widget-enabled {
   -webkit-transition: background-color 100ms;
@@ -22,8 +22,8 @@
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
   z-index: 4;
 }
-.oo-ui-popupTool .oo-ui-popupWidget {
-  /* @noflip */
+.oo-ui-popupTool .oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
+.oo-ui-popupTool .oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
   margin-left: 1.25em;
 }
 .oo-ui-toolGroupTool > .oo-ui-toolGroup {
@@ -37,9 +37,6 @@
   height: 2.5em;
   width: 1.875em;
 }
-.oo-ui-toolGroupTool > .oo-ui-popupToolGroup.oo-ui-labelElement > .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  line-height: 2.1;
-}
 .oo-ui-toolGroup {
   display: inline-block;
   vertical-align: middle;
   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;
   width: 1.875em;
   min-width: 1.875em;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title,
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
-  line-height: 2;
-}
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
   padding-left: 0.5em;
   color: #222;
   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 5280a9f..1574f6c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.3
+ * OOjs UI v0.19.5
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-01-04T00:22:40Z
+ * Date: 2017-03-07T22:57:01Z
  */
 ( 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 */
 
 /**
@@ -1463,6 +1469,7 @@ OO.ui.PopupTool = function OoUiPopupTool( toolGroup, config ) {
        OO.ui.mixin.PopupElement.call( this, config );
 
        // Initialization
+       this.popup.setPosition( toolGroup.getToolbar().position === 'bottom' ? 'above' : 'below' );
        this.$element
                .addClass( 'oo-ui-popupTool' )
                .append( this.popup.$element );
@@ -1741,10 +1748,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 +1794,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 +2031,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 +2101,10 @@ OO.inheritClass( OO.ui.ListToolGroup, OO.ui.PopupToolGroup );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.ListToolGroup.static.name = 'list';
 
 /* Methods */
@@ -2171,6 +2195,9 @@ OO.ui.ListToolGroup.prototype.updateCollapsibleState = function () {
        for ( i = 0, len = this.collapsibleTools.length; i < len; i++ ) {
                this.collapsibleTools[ i ].toggle( this.expanded );
        }
+
+       // Re-evaluate clipping, because our height has changed
+       this.clip();
 };
 
 /**
@@ -2240,7 +2267,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 +2329,10 @@ OO.inheritClass( OO.ui.MenuToolGroup, OO.ui.PopupToolGroup );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MenuToolGroup.static.name = 'menu';
 
 /* Methods */
index 941eb37..4ec3d1c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.3
+ * OOjs UI v0.19.5
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-01-04T00:22:45Z
+ * Date: 2017-03-07T22:57:06Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
@@ -33,7 +33,7 @@
   display: inline-block;
 }
 .oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
+  overflow: hidden;
 }
 .oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout {
   width: 100%;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
 .oo-ui-bookletLayout-outlinePanel-editable > .oo-ui-outlineSelectWidget {
   position: absolute;
   top: 0;
   left: 0;
   right: 0;
   bottom: 3em;
-  overflow-y: auto;
+  overflow: auto;
 }
 .oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
   position: absolute;
@@ -85,8 +79,6 @@
   left: 0;
   right: 0;
   bottom: 0;
-  /* stylelint-disable declaration-no-important */
-  /* stylelint-enable declaration-no-important */
 }
 .oo-ui-menuLayout-menu,
 .oo-ui-menuLayout-content {
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
-  -webkit-transform: translate3d(0, 0, 0);
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
   height: 2em;
   width: 4em;
   border-radius: 1em;
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
   cursor: default;
   border-width: 1px 0 1px 1px;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
-  top: 0;
   left: 0;
-  height: 2.3em;
   margin-left: 0.3em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
-  top: 0;
   right: 0;
-  height: 2.3em;
   margin-right: 0.775em;
 }
 .oo-ui-selectFileWidget-label {
 .oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
   opacity: 0.5;
 }
-.oo-ui-outlineOptionWidget-level-0 {
-  padding-left: 3.5em;
-}
-.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
-  left: 1em;
+.oo-ui-outlineOptionWidget-level-0.oo-ui-iconElement {
+  padding-left: 2.5em;
 }
 .oo-ui-outlineOptionWidget-level-1 {
-  padding-left: 5em;
+  padding-left: 2.5em;
+}
+.oo-ui-outlineOptionWidget-level-1.oo-ui-iconElement {
+  padding-left: 4.5em;
 }
-.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
+.oo-ui-outlineOptionWidget-level-1.oo-ui-iconElement .oo-ui-iconElement-icon {
   left: 2.5em;
 }
 .oo-ui-outlineOptionWidget-level-2 {
-  padding-left: 6.5em;
+  padding-left: 5em;
 }
-.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
-  left: 4em;
+.oo-ui-outlineOptionWidget-level-2.oo-ui-iconElement {
+  padding-left: 7em;
+}
+.oo-ui-outlineOptionWidget-level-2.oo-ui-iconElement .oo-ui-iconElement-icon {
+  left: 5em;
 }
 .oo-ui-selectWidget-depressed .oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected {
   background-color: #a7dcff;
   text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
 }
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
-  font-weight: bold;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
-  opacity: 0.5;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
-  color: #777;
-}
 .oo-ui-outlineControlsWidget {
   height: 3em;
   background-color: #fff;
   display: block;
   position: relative;
 }
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+}
 .oo-ui-capsuleMultiselectWidget-content {
   position: relative;
 }
 .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-handle:last-child {
   margin-right: 0;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator,
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
-  position: absolute;
-}
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
   border: 0;
   line-height: 1.675em;
   color: #000;
   vertical-align: middle;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
-  outline: none;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-webkit-input-placeholder {
+  color: #72777d;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
-  padding-right: 2.4875em;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-ms-input-placeholder {
+  color: #72777d;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
-  right: 0;
-  top: 0;
-  margin: 0.775em;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
+  outline: 0;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle {
   padding-left: 2.475em;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
   left: 0;
-  top: 0;
-  margin: 0.3em;
+  margin: 0 0.3em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
+  padding-right: 2.4875em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
 }
 .oo-ui-capsuleMultiselectWidget:hover .oo-ui-capsuleMultiselectWidget-handle {
   border-color: rgba(0, 0, 0, 0.2);
 .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;
   cursor: text;
 }
 .oo-ui-capsuleItemWidget:focus {
-  outline: none;
+  outline: 0;
   border-color: #087ecc;
 }
 .oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
   opacity: 0.5;
-  -webkit-transform: 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 37eee66..f64a619 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.3
+ * OOjs UI v0.19.5
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-01-04T00:22:45Z
+ * Date: 2017-03-07T22:57:06Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
 .oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement {
   display: inline-block;
 }
+.oo-ui-draggableElement-handle:focus {
+  border-radius: 2px;
+  box-shadow: inset 0 0 0 1px #36c, 0 0 0 1px #36c;
+  outline: 0;
+}
 .oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
+  overflow: hidden;
 }
 .oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout {
   width: 100%;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
 .oo-ui-bookletLayout-outlinePanel-editable > .oo-ui-outlineSelectWidget {
   position: absolute;
   top: 0;
   left: 0;
   right: 0;
   bottom: 3em;
-  overflow-y: auto;
+  overflow: auto;
 }
 .oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
   position: absolute;
@@ -68,7 +67,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;
@@ -91,8 +90,6 @@
   left: 0;
   right: 0;
   bottom: 0;
-  /* stylelint-disable declaration-no-important */
-  /* stylelint-enable declaration-no-important */
 }
 .oo-ui-menuLayout-menu,
 .oo-ui-menuLayout-content {
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
-  -webkit-transform: translate3d(0, 0, 0);
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
   background-color: #f8f9fa;
   width: 3.5em;
   min-height: 26px;
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
   cursor: default;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   left: 0;
-  top: 0;
-  height: 2.3em;
   margin-left: 0.5em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
-  top: 0;
   right: 0;
-  height: 2.3em;
   margin-right: 0.775em;
 }
 .oo-ui-selectFileWidget-label {
 .oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-label {
   right: 2em;
 }
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget {
-  background-color: #eaf3ff;
-}
 .oo-ui-selectFileWidget-dropTarget {
   background-color: #fff;
   border: 1px solid #a2a9b1;
+  border-radius: 2px;
   vertical-align: middle;
   overflow: hidden;
-  border-radius: 2px;
 }
 .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
   border-radius: 2px;
   white-space: normal;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget {
-  background-color: #eee;
+  background-color: #fff;
   border-style: dashed;
+  -webkit-transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+     -moz-transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+          transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+}
+.oo-ui-selectFileWidget-empty.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget:hover {
+  border-color: #72777d;
+}
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget {
+  background-color: #eaf3ff;
+  color: #36c;
 }
 .oo-ui-selectFileWidget.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
 .oo-ui-widget-disabled .oo-ui-selectFileWidget-dropLabel {
   display: none;
 }
+.oo-ui-outlineSelectWidget {
+  height: 100%;
+}
+.oo-ui-outlineSelectWidget:focus {
+  box-shadow: inset 0 0 0 2px #36c;
+}
 .oo-ui-outlineOptionWidget {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
 .oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
   opacity: 0.5;
 }
-.oo-ui-outlineOptionWidget-level-0 {
-  padding-left: 3.5em;
-}
-.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
-  left: 1em;
+.oo-ui-outlineOptionWidget-level-0.oo-ui-iconElement {
+  padding-left: 2.571em;
 }
 .oo-ui-outlineOptionWidget-level-1 {
-  padding-left: 5em;
-}
-.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
-  left: 2.5em;
+  padding-left: 2.571em;
 }
-.oo-ui-outlineOptionWidget-level-2 {
-  padding-left: 6.5em;
+.oo-ui-outlineOptionWidget-level-1.oo-ui-iconElement {
+  padding-left: 4.429em;
 }
-.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
-  left: 4em;
+.oo-ui-outlineOptionWidget-level-1.oo-ui-iconElement .oo-ui-iconElement-icon {
+  left: 2.571em;
 }
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
-  font-weight: bold;
+.oo-ui-outlineOptionWidget-level-2 {
+  padding-left: 5.142em;
 }
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
-  opacity: 0.5;
+.oo-ui-outlineOptionWidget-level-2.oo-ui-iconElement {
+  padding-left: 6.857em;
 }
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
-  color: #777;
+.oo-ui-outlineOptionWidget-level-2.oo-ui-iconElement .oo-ui-iconElement-icon {
+  left: 4.429em;
 }
 .oo-ui-outlineControlsWidget {
   height: 3em;
   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;
   display: block;
   position: relative;
 }
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+}
 .oo-ui-capsuleMultiselectWidget-content {
   position: relative;
 }
 .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:last-child {
   margin-right: 0;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator,
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
-  position: absolute;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
+  border: 0;
+  line-height: 1.675;
+  margin: 0 0 0 0.2em;
+  padding: 0;
+  font-size: inherit;
+  font-family: inherit;
+  background-color: transparent;
+  color: #000;
+  vertical-align: middle;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :-moz-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-webkit-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content ::-moz-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-ms-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :-ms-input-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content ::-webkit-input-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :placeholder-shown {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::placeholder {
   color: #72777d;
-}
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
-  border: 0;
-  line-height: 1.675;
-  margin: 0 0 0 0.2em;
-  padding: 0;
-  font-size: inherit;
-  font-family: inherit;
-  background-color: transparent;
-  color: #000;
-  vertical-align: middle;
+  opacity: 1;
 }
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
   outline: 0;
 }
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
-  padding-right: 2.4875em;
-}
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
-  right: 0;
-  top: 0;
-  margin: 0.775em;
-}
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle {
   padding-left: 2.475em;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
   left: 0;
-  top: 0;
-  margin: 0.3em;
+  margin: 0 0.3em;
 }
-.oo-ui-capsuleMultiselectWidget .oo-ui-popupWidget {
-  width: 100%;
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
+  padding-right: 2.4875em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
+}
+.oo-ui-capsuleMultiselectWidget-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;
   display: inline-block;
   cursor: default;
   white-space: nowrap;
-  width: auto;
-  max-width: 100%;
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
-  vertical-align: middle;
+  width: auto;
+  max-width: 100%;
   height: 1.7em;
-  line-height: 1.7;
-  background-color: #eee;
-  color: #222;
   margin: 0.1em;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
   padding: 0 0.4em;
+  line-height: 1.7;
+  vertical-align: middle;
 }
 .oo-ui-capsuleItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
   display: inline-block;
   overflow: hidden;
   cursor: text;
 }
-.oo-ui-capsuleItemWidget:focus {
-  outline: 0;
-  border-color: #36c;
-  box-shadow: inset 0 0 0 1px #36c;
-}
-.oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
-  background-color: #eaecf0;
-  color: #72777d;
-  border-color: #c8ccd1;
-  text-shadow: 0 1px 1px #fff;
-}
-.oo-ui-capsuleItemWidget > .oo-ui-buttonElement {
-  display: none;
-}
 .oo-ui-capsuleItemWidget.oo-ui-widget-enabled {
+  background-color: #f8f9fa;
+  color: #222;
   padding-right: 1.5375em;
+  -webkit-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+     -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+          transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-enabled:hover {
+  background-color: #fff;
+  color: #444;
+  border-color: #a2a9b1;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-enabled:focus {
+  border-color: #36c;
+  box-shadow: inset 0 0 0 1px #36c;
+  outline: 0;
 }
 .oo-ui-capsuleItemWidget.oo-ui-widget-enabled > .oo-ui-buttonElement {
   display: block;
   bottom: 0;
   height: auto;
 }
+.oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
+  background-color: #eaecf0;
+  color: #72777d;
+  border-color: #c8ccd1;
+  text-shadow: 0 1px 1px #fff;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-disabled > .oo-ui-buttonElement {
+  display: none;
+}
 .oo-ui-searchWidget-query {
   position: absolute;
   top: 0;
 .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 d7e92c2..d1fbe0d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.3
+ * OOjs UI v0.19.5
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-01-04T00:22:40Z
+ * Date: 2017-03-07T22:57:01Z
  */
 ( 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' );
 };
@@ -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 && !OO.ui.isMobile() ) {
-                                       layout.focus();
-                               }
+               page.scrollElementIntoView().done( function () {
+                       if ( layout.autoFocus && !OO.ui.isMobile() ) {
+                               layout.focus();
                        }
                } );
        }
@@ -2290,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 && !OO.ui.isMobile() ) {
-                                       layout.focus();
-                               }
+               card.scrollElementIntoView().done( function () {
+                       if ( layout.autoFocus && !OO.ui.isMobile() ) {
+                               layout.focus();
                        }
                } );
        }
@@ -3061,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 */
@@ -3108,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;
 };
@@ -3149,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;
 };
@@ -3262,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 */
@@ -3375,6 +3399,10 @@ OO.inheritClass( OO.ui.TabOptionWidget, OO.ui.OptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.TabOptionWidget.static.highlightable = false;
 
 /**
@@ -3575,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}.
@@ -3596,6 +3625,7 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
        // Configuration initialization
        config = $.extend( {
                allowArbitrary: false,
+               allowDuplicates: false,
                $overlay: this.$element
        }, config );
 
@@ -3627,6 +3657,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(
                {
@@ -3642,7 +3673,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 ) {
@@ -3692,12 +3723,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 () {
@@ -3718,6 +3753,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 */
 
 /**
@@ -3753,6 +3792,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
  *
@@ -3826,7 +3885,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 );
@@ -4050,20 +4109,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.
  *
@@ -4224,6 +4269,9 @@ OO.ui.CapsuleMultiselectWidget.prototype.updateIfHeightChanged = function () {
        if ( height !== this.height ) {
                this.height = height;
                this.menu.position();
+               if ( this.popup ) {
+                       this.popup.updateDimensions();
+               }
                this.emit( 'resize' );
        }
 };
@@ -4316,7 +4364,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 {
@@ -4329,10 +4377,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
index ff013a0..4353b43 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.3
+ * OOjs UI v0.19.5
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-01-04T00:22:45Z
+ * Date: 2017-03-07T22:57:06Z
  */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
   background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
index de26ac0..823b1a1 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.3
+ * OOjs UI v0.19.5
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-01-04T00:22:45Z
+ * Date: 2017-03-07T22:57:06Z
  */
 .oo-ui-window {
   background: transparent;
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless:active {
   background-color: rgba(0, 0, 0, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:hover,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover {
   background-color: rgba(8, 126, 204, 0.05);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:active,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active {
   background-color: rgba(8, 126, 204, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label {
   font-weight: bold;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive:hover,
   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 be81841..586efb0 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.3
+ * OOjs UI v0.19.5
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-01-04T00:22:40Z
+ * Date: 2017-03-07T22:57:01Z
  */
 ( 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' ] },
@@ -1442,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
@@ -1455,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 ];
                }
@@ -2320,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 } );
@@ -2365,7 +2399,6 @@ OO.ui.Dialog = function OoUiDialog( config ) {
        // Events
        this.actions.connect( this, {
                click: 'onActionClick',
-               resize: 'onActionResize',
                change: 'onActionsChange'
        } );
 
@@ -2449,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() );
@@ -2459,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.
  *
@@ -2698,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.
@@ -2728,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' }
 ];
@@ -2750,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.
  *
@@ -2810,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
  */
@@ -2826,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
@@ -3017,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' },
@@ -3095,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
  */
@@ -3167,7 +3189,9 @@ OO.ui.ProcessDialog.prototype.getActionWidgets = function ( actions ) {
 
        for ( i = 0, len = actions.length; i < len; i++ ) {
                config = $.extend( { framed: !OO.ui.isMobile() }, actions[ i ] );
-               if ( isMobile && ( config.flags === 'back' || config.flags.indexOf( 'back' ) !== -1 ) ) {
+               if ( isMobile &&
+                       ( config.flags === 'back' || ( Array.isArray( config.flags ) && config.flags.indexOf( 'back' ) !== -1 ) )
+               ) {
                        $.extend( config, {
                                icon: 'previous',
                                label: ''
@@ -3371,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;
 };
@@ -3395,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 ) {
@@ -3432,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 ) {
@@ -3463,7 +3483,7 @@ OO.ui.confirm = function ( text, options ) {
  *
  * @param {jQuery|string} text Message text to display
  * @param {Object} [options] Additional options, see OO.ui.MessageDialog#getSetupProcess
- * @cfg {Object} [textInput] Additional options for text input widget, see OO.ui.TextInputWidget
+ * @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`.
@@ -3478,9 +3498,8 @@ OO.ui.prompt = function ( text, options ) {
 
        // TODO: This is a little hacky, and could be done by extending MessageDialog instead.
 
-       return manager.openWindow( 'messageDialog', $.extend( {
-               message: textField.$element,
-               verbose: true
+       return manager.openWindow( 'message', $.extend( {
+               message: textField.$element
        }, options ) ).then( function ( opened ) {
                // After ready
                textInput.on( 'enter', function () {
index 394ec85..0cd901f 100644 (file)
                        "ltr": "images/icons/articleRedirect-ltr.svg",
                        "rtl": "images/icons/articleRedirect-rtl.svg"
                } },
+               "journal": { "file": {
+                       "ltr": "images/icons/journal-ltr.svg",
+                       "rtl": "images/icons/journal-rtl.svg"
+               } },
                "upload": { "file": {
                        "ltr": "images/icons/upload-ltr.svg",
                        "rtl": "images/icons/upload-rtl.svg"
index ec755a1..ea2e2ec 100644 (file)
@@ -56,6 +56,7 @@
                        "rtl": "images/icons/articleRedirect-rtl.svg"
                } },
                "searchCaseSensitive": { "file": "images/icons/case-sensitive.svg" },
+               "searchDiacritics": { "file": "images/icons/diacritic.svg" },
                "searchRegularExpression": { "file": "images/icons/regular-expression.svg" },
                "specialCharacter": { "file": "images/icons/specialCharacter.svg" },
                "table": { "file": "images/icons/table.svg" },
index 5b35e74..718f9ff 100644 (file)
                                "os": "images/icons/bold-cyrl-be.svg"
                        }
                } },
+               "highlight": { "file": {
+                       "ltr": "images/icons/highlight-ltr.svg",
+                       "rtl": "images/icons/highlight-rtl.svg"
+               } },
                "italic": { "file": {
                        "default": "images/icons/italic-a.svg",
                        "lang": {
index 449cb77..ec18f29 100644 (file)
@@ -8,8 +8,9 @@
                }
        },
        "images": {
-               "beta": { "file": "images/icons/beta.svg" },
-               "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg" },
+               "add": { "file": "images/icons/add.svg" },
+               "beta": { "file": "images/icons/beta.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
+               "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg", "deprecated": "Moved since v0.18.3, use 'logoWikimediaDiscovery' from the 'Wikimedia' pack instead." },
                "bookmark": { "file": {
                        "ltr": "images/icons/bookmark-ltr.svg",
                        "rtl": "images/icons/bookmark-rtl.svg"
                } },
                "clear": { "file": "images/icons/clear.svg" },
                "clock": { "file": "images/icons/clock.svg" },
+               "feedback": { "file": {
+                       "ltr": "images/icons/feedback-ltr.svg",
+                       "rtl": "images/icons/feedback-rtl.svg"
+               } },
                "funnel": { "file": {
                        "ltr": "images/icons/funnel-ltr.svg",
                        "rtl": "images/icons/funnel-rtl.svg"
@@ -45,7 +50,8 @@
                        "ltr": "images/icons/printer-ltr.svg",
                        "rtl": "images/icons/printer-rtl.svg"
                } },
-               "ribbonPrize": { "file": "images/icons/ribbonPrize.svg" },
+               "ribbonPrize": { "file": "images/icons/ribbonPrize.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
+               "subtract": { "file": "images/icons/subtract.svg" },
                "sun": { "file": {
                        "ltr": "images/icons/sun-ltr.svg",
                        "rtl": "images/icons/sun-rtl.svg"
index b5dff27..c8385e4 100644 (file)
@@ -6,7 +6,7 @@
                "blockUndo": { "file": {
                        "ltr": "images/icons/unBlock-ltr.svg",
                        "rtl": "images/icons/unBlock-rtl.svg"
-               } },
+               }, "deprecated": "Renamed since v0.18.3, use 'unBlock' instead." },
                "unBlock": { "file": {
                        "ltr": "images/icons/unBlock-ltr.svg",
                        "rtl": "images/icons/unBlock-rtl.svg"
@@ -18,7 +18,7 @@
                "flagUndo": { "file": {
                        "ltr": "images/icons/unFlag-ltr.svg",
                        "rtl": "images/icons/unFlag-rtl.svg"
-               } },
+               }, "deprecated": "Renamed since v0.18.3, use 'unFlag' instead." },
                "unFlag": { "file": {
                        "ltr": "images/icons/unFlag-ltr.svg",
                        "rtl": "images/icons/unFlag-rtl.svg"
                        "rtl": "images/icons/unLock-rtl.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": {
@@ -38,7 +42,7 @@
                "trashUndo": { "file": {
                        "ltr": "images/icons/unTrash-ltr.svg",
                        "rtl": "images/icons/unTrash-rtl.svg"
-               } },
+               }, "deprecated": "Renamed since v0.18.3, use 'unTrash' instead." },
                "ongoingConversation": {
                        "file": {
                                "ltr": "images/icons/ongoingConversation-ltr.svg",
index b5fbbed..f4a2dc9 100644 (file)
@@ -2,7 +2,7 @@
        "prefix": "oo-ui-icon",
        "intro": "@import '../../../../src/styles/common';",
        "images": {
-               "add": { "file": "images/icons/add.svg" },
+               "add": { "file": "images/icons/add.svg", "deprecated": "Moved since v0.19.5, use from the 'interactive' pack instead." },
                "advanced": { "file": "images/icons/advanced.svg" },
                "alert": { "file": "images/icons/alert.svg" },
                "cancel": { "file": "images/icons/cancel.svg" },
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.png
new file mode 100644 (file)
index 0000000..8deeddf
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.svg
new file mode 100644 (file)
index 0000000..a2d49a1
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
+    <g id="add">
+        <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
+    </g>
+</g></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>
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 46cd9b0..749e38f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="regular-expression">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
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 d058d65..b379e18 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="close">
-        <path id="cross" d="M17.717 7.697l-1.414-1.414L12 10.586 7.697 6.283 6.283 7.697 10.586 12l-4.303 4.303 1.414 1.414L12 13.414l4.303 4.303 1.414-1.414L13.414 12z"/>
-    </g>
+  <path d="M17.717 7.697l-1.414-1.414L12 10.586 7.697 6.283 6.283 7.697 10.586 12l-4.303 4.303 1.414 1.414L12 13.414l4.303 4.303 1.414-1.414L13.414 12z"/>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png b/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png
new file mode 100644 (file)
index 0000000..2359b19
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.svg b/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.svg
new file mode 100644 (file)
index 0000000..4565101
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</svg>
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/feedback-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.png
new file mode 100644 (file)
index 0000000..f49ebeb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.svg
new file mode 100644 (file)
index 0000000..d32e478
--- /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="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png
new file mode 100644 (file)
index 0000000..ac5787b
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.svg
new file mode 100644 (file)
index 0000000..0fdeed9
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.png
new file mode 100644 (file)
index 0000000..efba220
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.svg
new file mode 100644 (file)
index 0000000..14be7ff
--- /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.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png
new file mode 100644 (file)
index 0000000..fdbe5e1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.svg
new file mode 100644 (file)
index 0000000..022d86d
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</svg>
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>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.png
new file mode 100644 (file)
index 0000000..73dd6b9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.svg
new file mode 100644 (file)
index 0000000..eb42923
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
+    <path d="M5.066 18.236l.14-.244c.976-1.69 1.341-4.587.815-6.469l-.14-.507.2-.365L11.074 2l9.011 5.203-4.994 8.65-.204.354-.522.134c-1.893.485-4.22 2.252-5.195 3.94l-.14.244-.721-.416-1.041 1.89H3.914l1.893-3.336z" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.png
new file mode 100644 (file)
index 0000000..2ea2983
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.svg
new file mode 100644 (file)
index 0000000..9b1940e
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
+    <path d="M18.934 18.236l-.14-.244c-.976-1.69-1.341-4.587-.815-6.469l.14-.507-.2-.365L12.926 2 3.914 7.203l4.994 8.65.204.354.522.134c1.893.485 4.22 2.252 5.195 3.94l.14.244.721-.416 1.041 1.89h3.355l-1.893-3.336z" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.png
new file mode 100644 (file)
index 0000000..2af4eb0
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.svg
new file mode 100644 (file)
index 0000000..8a83e41
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+  <path d="M16 8V7h-6v1h6zm-2 2V9h-4v1h4zM6 4h1v16H6V4zm2 0h10v13c0 1.7-1.3 3-3 3H8V4z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.png
new file mode 100644 (file)
index 0000000..033ede1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.svg
new file mode 100644 (file)
index 0000000..2a07a44
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+  <path d="M8 8V7h6v1H8zm2 2V9h4v1h-4zm8-6h-1v16h1V4zm-2 0H6v13c0 1.7 1.3 3 3 3h7V4z"/>
+</svg>
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>
index 5058629..971ac48 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="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.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>
+</g></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>
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>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.png
new file mode 100644 (file)
index 0000000..4e58b70
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.svg
new file mode 100644 (file)
index 0000000..9595ac6
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
+       <path d="M18 13H6v-2h12"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/subtract.png b/resources/lib/oojs-ui/themes/apex/images/icons/subtract.png
new file mode 100644 (file)
index 0000000..bd719cb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/subtract.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/subtract.svg b/resources/lib/oojs-ui/themes/apex/images/icons/subtract.svg
new file mode 100644 (file)
index 0000000..a79f0b5
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+       <path d="M18 13H6v-2h12"/>
+</svg>
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>
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 21efb82..7cbbced 100644 (file)
@@ -76,6 +76,7 @@
                        "rtl": "images/icons/articleRedirect-rtl.svg"
                } },
                "searchCaseSensitive": { "file": "images/icons/case-sensitive.svg" },
+               "searchDiacritics": { "file": "images/icons/diacritic.svg" },
                "searchRegularExpression": { "file": "images/icons/regular-expression.svg" },
                "specialCharacter": { "file": "images/icons/specialCharacter.svg" },
                "table": { "file": "images/icons/table.svg" },
index c97d770..85e47ee 100644 (file)
                                "os": "images/icons/bold-cyrl-be.svg"
                        }
                } },
+               "highlight": { "file": {
+                       "ltr": "images/icons/highlight-ltr.svg",
+                       "rtl": "images/icons/highlight-rtl.svg"
+               } },
                "italic": { "file": {
                        "default": "images/icons/italic-a.svg",
                        "lang": {
index e040ffb..827a72e 100644 (file)
@@ -22,8 +22,9 @@
                }
        },
        "images": {
-               "beta": { "file": "images/icons/beta.svg" },
-               "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg" },
+               "add": { "file": "images/icons/add.svg", "variants": [ "constructive", "progressive" ] },
+               "beta": { "file": "images/icons/beta.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
+               "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg", "deprecated": "Moved since v0.18.3, use 'logoWikimediaDiscovery' from the 'Wikimedia' pack instead." },
                "bookmark": { "file": {
                        "ltr": "images/icons/bookmark-ltr.svg",
                        "rtl": "images/icons/bookmark-rtl.svg"
                } },
                "clear": { "file": "images/icons/clear.svg" },
                "clock": { "file": "images/icons/clock.svg" },
+               "feedback": {
+                       "file": {
+                               "ltr": "images/icons/feedback-ltr.svg",
+                               "rtl": "images/icons/feedback-rtl.svg"
+                       },
+                       "variants": [ "progressive" ]
+               },
                "funnel": { "file": {
                        "ltr": "images/icons/funnel-ltr.svg",
                        "rtl": "images/icons/funnel-rtl.svg"
@@ -59,7 +67,8 @@
                        "ltr": "images/icons/printer-ltr.svg",
                        "rtl": "images/icons/printer-rtl.svg"
                } },
-               "ribbonPrize": { "file": "images/icons/ribbonPrize.svg" },
+               "ribbonPrize": { "file": "images/icons/ribbonPrize.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
+               "subtract": { "file": "images/icons/subtract.svg" },
                "sun": { "file": {
                        "ltr": "images/icons/sun-ltr.svg",
                        "rtl": "images/icons/sun-rtl.svg"
index 9cc0f32..b4acff1 100644 (file)
@@ -26,7 +26,7 @@
                "blockUndo": { "file": {
                        "ltr": "images/icons/unBlock-ltr.svg",
                        "rtl": "images/icons/unBlock-rtl.svg"
-               } },
+               }, "deprecated": "Renamed since v0.18.3, use 'unBlock' instead." },
                "unBlock": { "file": {
                        "ltr": "images/icons/unBlock-ltr.svg",
                        "rtl": "images/icons/unBlock-rtl.svg"
@@ -42,7 +42,7 @@
                "flagUndo": { "file": {
                        "ltr": "images/icons/unFlag-ltr.svg",
                        "rtl": "images/icons/unFlag-rtl.svg"
-               } },
+               }, "deprecated": "Renamed since v0.18.3, use 'unFlag' instead." },
                "lock": { "file": {
                        "ltr": "images/icons/lock-ltr.svg",
                        "rtl": "images/icons/lock-rtl.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": {
@@ -61,7 +65,7 @@
                "trashUndo": { "file": {
                        "ltr": "images/icons/unTrash-ltr.svg",
                        "rtl": "images/icons/unTrash-rtl.svg"
-               } },
+               }, "deprecated": "Renamed since v0.18.3, use 'unTrash' instead." },
                "ongoingConversation": {
                        "file": {
                                "ltr": "images/icons/ongoingConversation-ltr.svg",
index 4666fd1..60c05f3 100644 (file)
                }
        },
        "images": {
-               "add": { "file": "images/icons/add.svg", "variants": [ "constructive", "progressive" ] },
+               "add": { "file": "images/icons/add.svg", "variants": [ "constructive", "progressive" ], "deprecated": "Moved since v0.19.5, use from the 'interactive' pack instead." },
                "advanced": { "file": "images/icons/advanced.svg" },
                "alert": { "file": "images/icons/alert.svg", "variants": [ "warning" ] },
                "cancel": { "file": "images/icons/cancel.svg", "variants": [ "destructive" ] },
                "check": { "file": "images/icons/check.svg", "variants": [ "constructive", "progressive", "destructive" ] },
                "circle": { "file": "images/icons/circle.svg", "variants": [ "constructive", "progressive" ] },
-               "close": { "file": {
-                       "ltr": "images/icons/close-ltr.svg",
-                       "rtl": "images/icons/close-rtl.svg"
-               } },
+               "close": { "file": "images/icons/close.svg" },
                "code": { "file": "images/icons/code.svg" },
                "collapse": { "file": "images/icons/collapse.svg" },
                "comment": { "file": "images/icons/comment.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 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>
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 f01a779..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: #d33 }</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>
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 3391d4e..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: #d33 }</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..e5590a3 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>
-    <g id="regular-expression">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
-</svg>
+</g></svg>
index a81eb4c..ff6e102 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>
-    <g id="regular-expression">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
-</svg>
+</g></svg>
index 46cd9b0..749e38f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="regular-expression">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
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 059f0bd..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: #d33 }</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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.png
new file mode 100644 (file)
index 0000000..92af7b6
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.svg
new file mode 100644 (file)
index 0000000..8027fff
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+  <path d="M18 7.6l-1.4-1.4-4.6 4.6-4.6-4.6L6 7.6l4.6 4.6L6 16.8l1.4 1.4 4.6-4.6 4.6 4.6 1.4-1.4-4.6-4.6z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png
deleted file mode 100644 (file)
index a35e9d1..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.svg
deleted file mode 100644 (file)
index 0ea5a9a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <g id="close">
-        <path id="cross" d="M17.4 8.1c.8-.8.8-2 0-2.8L12 10.8 7.4 6.2 6 7.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.png
deleted file mode 100644 (file)
index 69f0787..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.svg
deleted file mode 100644 (file)
index dd053f1..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <g id="close">
-        <path id="cross" d="M17.4 8.1c.8-.8.8-2 0-2.8L12 10.8 7.4 6.2 6 7.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png
deleted file mode 100644 (file)
index b6a42b8..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.svg
deleted file mode 100644 (file)
index c269316..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="close">
-        <path id="cross" d="M17.4 8.1c.8-.8.8-2 0-2.8L12 10.8 7.4 6.2 6 7.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.png
new file mode 100644 (file)
index 0000000..06fcd5d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.svg
new file mode 100644 (file)
index 0000000..37c960e
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+  <path d="M18 7.6l-1.4-1.4-4.6 4.6-4.6-4.6L6 7.6l4.6 4.6L6 16.8l1.4 1.4 4.6-4.6 4.6 4.6 1.4-1.4-4.6-4.6z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png
deleted file mode 100644 (file)
index 16462a2..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg
deleted file mode 100644 (file)
index 848a0e3..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <g id="close">
-        <path id="cross" d="M6.6 8.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 7.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 13.6l-4.6 4.6L6 16.8l4.6-4.6z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.png
deleted file mode 100644 (file)
index 2c88596..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.svg
deleted file mode 100644 (file)
index 6d53d36..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <g id="close">
-        <path id="cross" d="M6.6 8.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 7.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 13.6l-4.6 4.6L6 16.8l4.6-4.6z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png
deleted file mode 100644 (file)
index e3e2417..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.svg
deleted file mode 100644 (file)
index 36e58ec..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="close">
-        <path id="cross" d="M6.6 8.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 7.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 13.6l-4.6 4.6L6 16.8l4.6-4.6z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.png
new file mode 100644 (file)
index 0000000..cdb037a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.svg
new file mode 100644 (file)
index 0000000..88ffb56
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+  <path d="M18 7.6l-1.4-1.4-4.6 4.6-4.6-4.6L6 7.6l4.6 4.6L6 16.8l1.4 1.4 4.6-4.6 4.6 4.6 1.4-1.4-4.6-4.6z"/>
+</svg>
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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png
new file mode 100644 (file)
index 0000000..7bb19e3
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.svg
new file mode 100644 (file)
index 0000000..b19dd0d
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <g id="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png
new file mode 100644 (file)
index 0000000..eb76fd0
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.svg
new file mode 100644 (file)
index 0000000..fed1164
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <g id="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png
new file mode 100644 (file)
index 0000000..2359b19
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.svg
new file mode 100644 (file)
index 0000000..4565101
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</svg>
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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png
new file mode 100644 (file)
index 0000000..f49ebeb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.svg
new file mode 100644 (file)
index 0000000..8ed4be9
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png
new file mode 100644 (file)
index 0000000..28405a8
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..49425d0
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png
new file mode 100644 (file)
index 0000000..ac5787b
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.svg
new file mode 100644 (file)
index 0000000..0fdeed9
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png
new file mode 100644 (file)
index 0000000..efba220
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.svg
new file mode 100644 (file)
index 0000000..f4e7932
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png
new file mode 100644 (file)
index 0000000..27bcc2d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..413ea34
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png
new file mode 100644 (file)
index 0000000..fdbe5e1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.svg
new file mode 100644 (file)
index 0000000..022d86d
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</svg>
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
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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.png
new file mode 100644 (file)
index 0000000..314d7ac
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.svg
new file mode 100644 (file)
index 0000000..e301dea
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24"><g fill="#fff">
+    <path d="M5.066 18.236l.14-.244c.976-1.69 1.341-4.587.815-6.469l-.14-.507.2-.365L11.074 2l9.011 5.203-4.994 8.65-.204.354-.522.134c-1.893.485-4.22 2.252-5.195 3.94l-.14.244-.721-.416-1.041 1.89H3.914l1.893-3.336z" fill-rule="evenodd"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.png
new file mode 100644 (file)
index 0000000..14bd7be
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..4cc90b5
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24"><g fill="#36c">
+    <path d="M5.066 18.236l.14-.244c.976-1.69 1.341-4.587.815-6.469l-.14-.507.2-.365L11.074 2l9.011 5.203-4.994 8.65-.204.354-.522.134c-1.893.485-4.22 2.252-5.195 3.94l-.14.244-.721-.416-1.041 1.89H3.914l1.893-3.336z" fill-rule="evenodd"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.png
new file mode 100644 (file)
index 0000000..73dd6b9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.svg
new file mode 100644 (file)
index 0000000..eb42923
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
+    <path d="M5.066 18.236l.14-.244c.976-1.69 1.341-4.587.815-6.469l-.14-.507.2-.365L11.074 2l9.011 5.203-4.994 8.65-.204.354-.522.134c-1.893.485-4.22 2.252-5.195 3.94l-.14.244-.721-.416-1.041 1.89H3.914l1.893-3.336z" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.png
new file mode 100644 (file)
index 0000000..024595e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.svg
new file mode 100644 (file)
index 0000000..46d61c2
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24"><g fill="#fff">
+    <path d="M18.934 18.236l-.14-.244c-.976-1.69-1.341-4.587-.815-6.469l.14-.507-.2-.365L12.926 2 3.914 7.203l4.994 8.65.204.354.522.134c1.893.485 4.22 2.252 5.195 3.94l.14.244.721-.416 1.041 1.89h3.355l-1.893-3.336z" fill-rule="evenodd"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.png
new file mode 100644 (file)
index 0000000..039ccbe
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..4f3997a
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24"><g fill="#36c">
+    <path d="M18.934 18.236l-.14-.244c-.976-1.69-1.341-4.587-.815-6.469l.14-.507-.2-.365L12.926 2 3.914 7.203l4.994 8.65.204.354.522.134c1.893.485 4.22 2.252 5.195 3.94l.14.244.721-.416 1.041 1.89h3.355l-1.893-3.336z" fill-rule="evenodd"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.png
new file mode 100644 (file)
index 0000000..2ea2983
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.svg
new file mode 100644 (file)
index 0000000..9b1940e
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
+    <path d="M18.934 18.236l-.14-.244c-.976-1.69-1.341-4.587-.815-6.469l.14-.507-.2-.365L12.926 2 3.914 7.203l4.994 8.65.204.354.522.134c1.893.485 4.22 2.252 5.195 3.94l.14.244.721-.416 1.041 1.89h3.355l-1.893-3.336z" fill-rule="evenodd"/>
+</svg>
index 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 e7dc90e..bc2e9cc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-invert.png differ
index d9eb01e..370d0a3 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" 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="M16 9V8h-6v1h6zm-2 2v-1h-4v1h4zM6 5h1v16H6V5zm2 0h10v13c0 1.7-1.3 3-3 3H8V5z"/>
-</svg>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+  <path d="M16 8V7h-6v1h6zm-2 2V9h-4v1h4zM6 4h1v16H6V4zm2 0h10v13c0 1.7-1.3 3-3 3H8V4z"/>
+</g></svg>
index 444d48b..19f17bd 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-progressive.png differ
index 5375d92..baf8a4a 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" 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="M16 9V8h-6v1h6zm-2 2v-1h-4v1h4zM6 5h1v16H6V5zm2 0h10v13c0 1.7-1.3 3-3 3H8V5z"/>
-</svg>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+  <path d="M16 8V7h-6v1h6zm-2 2V9h-4v1h4zM6 4h1v16H6V4zm2 0h10v13c0 1.7-1.3 3-3 3H8V4z"/>
+</g></svg>
index f30b5ff..2af4eb0 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr.png differ
index c9fa553..8a83e41 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M16 9V8h-6v1h6zm-2 2v-1h-4v1h4zM6 5h1v16H6V5zm2 0h10v13c0 1.7-1.3 3-3 3H8V5z"/>
+  <path d="M16 8V7h-6v1h6zm-2 2V9h-4v1h4zM6 4h1v16H6V4zm2 0h10v13c0 1.7-1.3 3-3 3H8V4z"/>
 </svg>
index deb4f76..60b5f47 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-invert.png differ
index bd7ba07..4660285 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" 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="M8 9V8h6v1H8zm2 2v-1h4v1h-4zm8-6h-1v16h1V5zm-2 0H6v13c0 1.7 1.3 3 3 3h7V5z"/>
-</svg>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+  <path d="M8 8V7h6v1H8zm2 2V9h4v1h-4zm8-6h-1v16h1V4zm-2 0H6v13c0 1.7 1.3 3 3 3h7V4z"/>
+</g></svg>
index e5a4fa1..b16badc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-progressive.png differ
index e93ed43..17ccb82 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" 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="M8 9V8h6v1H8zm2 2v-1h4v1h-4zm8-6h-1v16h1V5zm-2 0H6v13c0 1.7 1.3 3 3 3h7V5z"/>
-</svg>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+  <path d="M8 8V7h6v1H8zm2 2V9h4v1h-4zm8-6h-1v16h1V4zm-2 0H6v13c0 1.7 1.3 3 3 3h7V4z"/>
+</g></svg>
index 7826fa8..033ede1 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl.png differ
index 84da9fa..2a07a44 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M8 9V8h6v1H8zm2 2v-1h4v1h-4zm8-6h-1v16h1V5zm-2 0H6v13c0 1.7 1.3 3 3 3h7V5z"/>
+  <path d="M8 8V7h6v1H8zm2 2V9h4v1h-4zm8-6h-1v16h1V4zm-2 0H6v13c0 1.7 1.3 3 3 3h7V4z"/>
 </svg>
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 2cfa62e..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: #d33 }</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 2daea47..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: #d33 }</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>
index 21548d9..9c4a955 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" 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.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>
+</g></svg>
index 359d032..594cdfb 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" 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.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>
+</g></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 548e136..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>
+<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"/>
-</svg>
+</g></svg>
index daf032a..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>
+<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"/>
-</svg>
+</g></svg>
index cfa98d8..eb5e624 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 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>
+</g></svg>
 
index 7cf1509..3e0ea6c 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 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>
+</g></svg>
 
index 8b02ddb..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>
+<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"/>
-</svg>
+</g></svg>
index c920c8d..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>
+<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"/>
-</svg>
+</g></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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.png
new file mode 100644 (file)
index 0000000..4e58b70
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.svg
new file mode 100644 (file)
index 0000000..d76eb3c
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+       <path d="M18 13H6v-2h12"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.png
new file mode 100644 (file)
index 0000000..1732972
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.svg
new file mode 100644 (file)
index 0000000..24795ac
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+       <path d="M18 13H6v-2h12"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.png
new file mode 100644 (file)
index 0000000..bd719cb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.svg
new file mode 100644 (file)
index 0000000..a79f0b5
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+       <path d="M18 13H6v-2h12"/>
+</svg>
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 0732f2e..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: #d33 }</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 59ad3f2..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: #d33 }</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>
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>
index 36fd719..148da47 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" 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 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>
+</g></svg>
index bc96e99..e80e6ae 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" 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 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>
+</g></svg>
index b6f1610..8aace96 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" 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 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>
+</g></svg>
index dc03220..1337e16 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" 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 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>
+</g></svg>
index c73d23f..dba18af 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" 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.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
+</g></svg>
\ No newline at end of file
index 16b6d3a..e84befe 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" 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.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
+</g></svg>
\ No newline at end of file
index 440390e..88256ec 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" 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.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
+</g></svg>
\ No newline at end of file
index 7f45734..fcb4d11 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" 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.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
+</g></svg>
\ No newline at end of file
index d45ebac..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: #d33 }</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 5e6d205..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: #d33 }</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>
index 0763ff8..efa8e83 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" 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.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>
+</g></svg>
index 6d1fdd9..c5bf2cc 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" 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.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>
+</g></svg>
index 12e57b2..3fb2085 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" 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 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>
+</g></svg>
index 6395968..0a67774 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" 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 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>
+</g></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>
diff --git a/resources/src/dom-level2-skip.js b/resources/src/dom-level2-skip.js
deleted file mode 100644 (file)
index 484c295..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * Skip function for dom-level2-shim module.
- *
- * Tests for window.Node because that's the only thing that this shim is adding.
- */
-return !!window.Node;
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 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 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 1b64237..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 ) {
index f4ef540..11f472e 100644 (file)
@@ -1,4 +1,4 @@
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 /* Table Sorting */
 
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;
index 011f9c5..938962f 100644 (file)
@@ -2,27 +2,31 @@
        var collapsibleLists, handleOne;
 
        // Collapsible lists of categories and templates
+       // If changing or removing a storeKey, ensure there is a strategy for old keys.
+       // E.g. detect existence via requestIdleCallback and remove. (T121646)
        collapsibleLists = [
                {
                        listSel: '.templatesUsed ul',
                        togglerSel: '.mw-templatesUsedExplanation',
-                       cookieName: 'templates-used-list'
+                       storeKey: 'mwedit-state-templatesUsed'
                },
                {
                        listSel: '.hiddencats ul',
                        togglerSel: '.mw-hiddenCategoriesExplanation',
-                       cookieName: 'hidden-categories-list'
+                       storeKey: 'mwedit-state-hiddenCategories'
                },
                {
                        listSel: '.preview-limit-report-wrapper',
                        togglerSel: '.mw-limitReportExplanation',
-                       cookieName: 'preview-limit-report'
+                       storeKey: 'mwedit-state-limitReport'
                }
        ];
 
-       handleOne = function ( $list, $toggler, cookieName ) {
-               // Collapsed by default
-               var isCollapsed = mw.cookie.get( cookieName ) !== 'expanded';
+       handleOne = function ( $list, $toggler, storeKey ) {
+               var collapsedVal = '0',
+                       expandedVal = '1',
+                       // Default to collapsed if not set
+                       isCollapsed = mw.storage.get( storeKey ) !== expandedVal;
 
                // Style the toggler with an arrow icon and add a tabIndex and a role for accessibility
                $toggler.addClass( 'mw-editfooter-toggler' ).prop( 'tabIndex', 0 ).attr( 'role', 'button' );
 
                $list.on( 'beforeExpand.mw-collapsible', function () {
                        $toggler.removeClass( 'mw-icon-arrow-collapsed' ).addClass( 'mw-icon-arrow-expanded' );
-                       mw.cookie.set( cookieName, 'expanded' );
+                       mw.storage.set( storeKey, expandedVal );
                } );
 
                $list.on( 'beforeCollapse.mw-collapsible', function () {
                        $toggler.removeClass( 'mw-icon-arrow-expanded' ).addClass( 'mw-icon-arrow-collapsed' );
-                       mw.cookie.set( cookieName, 'collapsed' );
+                       mw.storage.set( storeKey, collapsedVal );
                } );
        };
 
@@ -55,7 +59,7 @@
                        handleOne(
                                $editForm.find( collapsibleLists[ i ].listSel ),
                                $editForm.find( collapsibleLists[ i ].togglerSel ),
-                               collapsibleLists[ i ].cookieName
+                               collapsibleLists[ i ].storeKey
                        );
                }
        } );
index 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 7e966ea..31c22af 100644 (file)
@@ -59,6 +59,7 @@
                        }
 
                        params = {
+                               formatversion: 2,
                                action: 'stashedit',
                                title: mw.config.get( 'wgPageName' ),
                                section: section,
index 0ee4058..d228236 100644 (file)
@@ -6,6 +6,10 @@
 #wpTextbox1 {
        margin: 0;
        display: block;
+       /* Ensure the textarea is not higher than browser's viewport on small screens */
+       max-height: 100vh;
+       /* But don't let it collapse into nothingness on really tiny screens */
+       min-height: 5em;
 }
 
 /* Adjustments to edit form elements */
        font-size: 0.9em;
 }
 
-#wpSummary {
+input#wpSummary {
        display: block;
+       background-color: #fff;
+       color: #000;
+       width: 80%;
        margin-top: 0;
-       margin-bottom: 0.5em;
+       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;
 }
 
 .editButtons input:first-child {
-       margin-left: .1em;
+       margin-left: 0.1em;
 }
 
 /*
index fd5dbc9..f3ea163 100644 (file)
@@ -1,6 +1,6 @@
 /* Styles for the JavaScript enhancements of the history page */
 
-#pagehistory li.before input[name="oldid"],
-#pagehistory li.after input[name="diff"] {
+#pagehistory li.before input[name='oldid'],
+#pagehistory li.after input[name='diff'] {
        visibility: hidden;
 }
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 1f0365e..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 {
@@ -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 #a2a9b1;
 
 .mw_metadata th {
        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..a5ca65e 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;
@@ -32,7 +32,7 @@
 }
 
 .skin-monobook .postedit {
-       top: 6em !important;
+       top: 6em !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .postedit-faded {
@@ -55,7 +55,7 @@
 
 .postedit-close {
        position: absolute;
-       padding: 0 .8em;
+       padding: 0 0.8em;
        right: 0;
        top: 0;
        font-size: 1.25em;
index b791db8..dccbacc 100644 (file)
        list-style: none none;
        display: inline;
        /* shared.css has some very weird directionality-specific rules for 'ul' we need to override,
-          search for "Correct directionality when page dir is different from site/user dir" */
+        * search for "Correct directionality when page dir is different from site/user dir" */
+       /* stylelint-disable declaration-no-important */
        margin: 0 !important;
        padding: 0 !important;
+       /* stylelint-enable declaration-no-important */
 }
 
 /* @noflip */
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();
                }
index ec94df3..e3e80d8 100644 (file)
@@ -99,26 +99,26 @@ img {
  * MediaWiki-specific elements
  */
 #globalWrapper {
-       width: 100% !important;
-       min-width: 0 !important;
+       width: 100% !important; /* stylelint-disable-line declaration-no-important */
+       min-width: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .mw-body {
        background: #fff;
        color: #000;
-       border: 0 !important;
-       padding: 0 !important;
-       margin: 0 !important;
+       border: 0 !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
+       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
        direction: ltr;
 }
 
 #column-content {
-       margin: 0 !important;
+       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 #column-content .mw-body {
        padding: 1em;
-       margin: 0 !important;
+       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 #toc {
@@ -164,40 +164,34 @@ img {
  * Links
  */
 a {
-       background: none !important;
-       padding: 0 !important;
+       background: none !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 /* Expand URLs for printing */
-.mw-body a.external.text:after,
-.mw-body a.external.autonumber:after {
-       content: " (" attr( href ) ")";
+.mw-body-content a.external.text:after,
+.mw-body-content a.external.autonumber:after {
+       content: ' (' attr( href ) ')';
        word-break: break-all;
        word-wrap: break-word;
 }
 
 /* Expand protocol-relative URLs for printing */
-.mw-body a.external.text[href^='//']:after,
-.mw-body a.external.autonumber[href^='//']:after {
-       content: " (https:" attr( href ) ")";
+.mw-body-content a.external.text[href^='//']:after,
+.mw-body-content a.external.autonumber[href^='//']:after {
+       content: ' (https:' attr( href ) ')';
 }
 
-/* MSIE/Win doesn't understand 'inherit' */
 a,
 a.external,
 a.new,
 a.stub {
-       color: #000 !important;
-       text-decoration: none !important;
-}
-
-/* Continue ... */
-a,
-a.external,
-a.new,
-a.stub {
-       color: inherit !important;
-       text-decoration: inherit !important;
+       /* IE 6 & 7 don't understand `inherit` */
+       color: #000 !important; /* stylelint-disable-line declaration-no-important */
+       text-decoration: none !important; /* stylelint-disable-line declaration-no-important */
+       /* Modern browser will apply this, IE 6 & 7 ignore the unknown */
+       color: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties, declaration-no-important */
+       text-decoration: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties, declaration-no-important */
 }
 
 /**
@@ -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 befe957..ff0c0e3 100644 (file)
@@ -56,22 +56,22 @@ wbr {
 
 /* Input types that should follow user direction, like buttons */
 /* TODO: What about buttons in wikipage content ? */
-input[type="submit"],
-input[type="button"],
-input[type="reset"],
-input[type="file"] {
+input[type='submit'],
+input[type='button'],
+input[type='reset'],
+input[type='file'] {
        direction: ltr;
 }
 
 /* Override default values */
-textarea[dir="ltr"],
-input[dir="ltr"] {
+textarea[dir='ltr'],
+input[dir='ltr'] {
        /* @noflip */
        direction: ltr;
 }
 
-textarea[dir="rtl"],
-input[dir="rtl"] {
+textarea[dir='rtl'],
+input[dir='rtl'] {
        /* @noflip */
        direction: rtl;
 }
@@ -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;
        }
 }
@@ -166,6 +166,7 @@ div.patrollink {
  */
 td.mw-label {
        text-align: right;
+       vertical-align: middle;
 }
 
 td.mw-input {
@@ -174,21 +175,9 @@ td.mw-input {
 
 td.mw-submit {
        text-align: left;
-}
-
-td.mw-label {
-       vertical-align: middle;
-}
-
-td.mw-submit {
        white-space: nowrap;
 }
 
-input#wpSummary {
-       width: 80%;
-       margin-bottom: 1em;
-}
-
 .mw-input-with-label {
        white-space: nowrap;
        display: inline-block;
@@ -226,7 +215,7 @@ input#wpSummary {
 #catlinks {
        /**
         * Overrides text justification (user preference)
-        * See bug 31990
+        * See T33990
         */
        text-align: left;
 }
@@ -248,15 +237,15 @@ input#wpSummary {
        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;
 }
@@ -328,7 +317,7 @@ th.mw-revdel-checkbox {
        text-align: center;
 }
 
-/* red links; see bug 36276 */
+/* red links; see T38276 */
 a.new {
        color: #ba0000;
 }
@@ -336,11 +325,11 @@ a.new {
 /* Plainlinks - this can be used to switch
  * off special external link styling */
 .plainlinks a.external {
-       background: none !important;
-       padding: 0 !important;
+       background: none !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
-/* External URLs should always be treated as LTR (bug 4330) */
+/* External URLs should always be treated as LTR (T6330) */
 /* @noflip */ .rtl a.external.free,
 .rtl a.external.autonumber {
        direction: ltr;
@@ -400,11 +389,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,
@@ -414,8 +403,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 {
@@ -551,103 +540,106 @@ table.wikitable > caption {
 }
 
 .mw-small-spinner {
-       padding: 10px !important;
+       padding: 10px !important; /* stylelint-disable-line declaration-no-important */
        margin-right: 0.6em;
        background-image: url( images/spinner.gif );
        background-position: center center;
        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) {
-       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) {
+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; /* stylelint-disable-line declaration-no-important */
+}
+
+/* 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 */
@@ -724,7 +716,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..1e952b0 100644 (file)
@@ -1,7 +1,7 @@
 // Common Less mixin library for MediaWiki
 //
 // By default the folder containing this file is included in $wgResourceLoaderLESSImportPaths,
-// which makes this file importable by all less files via '@import "mediawiki.mixins";'.
+// which makes this file importable by all less files via `@import 'mediawiki.mixins';`.
 //
 // The mixins included below are considered a public interface for MediaWiki extensions.
 // The signatures of parametrized mixins should be kept as stable as possible.
 }
 
 .flex-display( @display: flex ) {
-       display: ~"-webkit-@{display}"; // iOS 6-, Safari 3.1-6
-       display: ~"-moz-@{display}"; // Firefox 21-
-       display: ~"-ms-@{display}box"; // IE 10
+       display: ~'-webkit-@{display}'; // iOS 6-, Safari 3.1-6
+       display: ~'-moz-@{display}'; // Firefox 21-
+       display: ~'-ms-@{display}box'; // IE 10
        display: @display;
 }
 
+.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() {
        display: block;
-       position: absolute !important;
+       position: absolute !important; /* stylelint-disable-line declaration-no-important */
        clip: rect( 1px, 1px, 1px, 1px );
        width: 1px;
        height: 1px;
index a404286..64d6b3d 100644 (file)
@@ -1,7 +1,7 @@
 // This is a separate file because importing the mixin causes
 // the keyframes blocks to be included in the output, regardless
 // of whether .rotation is used.
-@import "mediawiki.mixins.animation";
+@import 'mediawiki.mixins.animation';
 
 .rotate-frames() {
        from {
index 1bfa3a3..a0ff767 100644 (file)
@@ -17,8 +17,8 @@
        line-height: normal;
        font-weight: normal;
 
-       & > input[type="checkbox"],
-       & > input[type="radio"] {
+       & > input[type='checkbox'],
+       & > input[type='radio'] {
                width: auto;
                height: auto;
                margin: 0 0.1em 0 0;
index 9688f1f..d4937c6 100644 (file)
 // Form input sizes
 @checkboxSize: 2em;
 @radioSize: 2em;
-
-// The following rules are deprecated
-@colorWhite: #fff;
-@colorOffWhite: #fafafa;
-@colorGrayDark: #898989;
-@colorGrayLight: #ccc;
-@colorGrayLighter: #ddd;
-@colorGrayLightest: #eee;
-// Green; for contextual use of a positive finalizing action
-@colorConstructive: #00af89;
-@colorConstructiveHighlight: #1c6665;
-@colorConstructiveActive: #134645;
-
index b069d4a..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 () {
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..d6ce734
--- /dev/null
@@ -0,0 +1,60 @@
+( 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
+        * @param {jQuery} $fieldset
+        */
+       mw.rcfilters.dm.ChangesListViewModel.prototype.update = function ( changesListContent, $fieldset ) {
+               this.valid = true;
+               this.emit( 'update', changesListContent, $fieldset );
+       };
+
+}( 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 ) );
index 63db0ea..0df34f8 100644 (file)
@@ -6,24 +6,46 @@
         *
         * @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} [selected] Filter is selected
+        * @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, config ) {
+       mw.rcfilters.dm.FilterItem = function MwRcfiltersDmFilterItem( name, groupModel, config ) {
                config = config || {};
 
                // Mixin constructor
                OO.EventEmitter.call( this );
 
                this.name = name;
-               this.group = config.group || '';
+               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 */
 
        /* Methods */
 
+       /**
+        * Return the representation of the state of this item.
+        *
+        * @return {Object} State of the object
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getState = function () {
+               return {
+                       selected: this.isSelected(),
+                       included: this.isIncluded(),
+                       conflicted: this.isConflicted(),
+                       fullyCovered: this.isFullyCovered()
+               };
+       };
+
        /**
         * Get the name of this filter
         *
                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.getGroup = function () {
-               return this.group;
+       mw.rcfilters.dm.FilterItem.prototype.getGroupName = function () {
+               return this.groupModel.getName();
        };
 
        /**
                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 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
         *
                        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();
+       };
+
+       /**
+        * Check if the filter is currently highlighted
+        *
+        * @return {boolean}
+        */
+       mw.rcfilters.dm.FilterItem.prototype.isHighlighted = function () {
+               return this.isHighlightEnabled() && !!this.getHighlightColor();
+       };
 }( mediaWiki ) );
index 3217d0d..5be3656 100644 (file)
                OO.EmitterList.call( this );
 
                this.groups = {};
+               this.defaultParams = {};
+               this.defaultFiltersEmpty = null;
+               this.highlightEnabled = false;
 
                // Events
-               this.aggregate( { update: 'itemUpdate' } );
+               this.aggregate( { update: 'filterItemUpdate' } );
+               this.connect( this, { filterItemUpdate: [ 'emit', 'itemUpdate' ] } );
        };
 
        /* Initialization */
         * 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,
+               var i, filterItem, selectedFilterNames,
                        model = this,
-                       items = [];
+                       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 ) {
-                       model.groups[ group ] = model.groups[ group ] || {};
-                       model.groups[ group ].filters = model.groups[ group ].filters || [];
-
-                       model.groups[ group ].title = data.title;
-                       model.groups[ group ].type = data.type;
-                       model.groups[ group ].separator = data.separator || '|';
+                       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, {
+                               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,
-                                       selected: data.filters[ i ].selected
+                                       subset: data.filters[ i ].subset,
+                                       cssClass: data.filters[ i ].class
                                } );
 
-                               model.groups[ group ].filters.push( filterItem );
+                               // 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 object that defines groups and their filter items.
-        * The structure of this response:
-        * {
-        *   groupName: {
-        *     title: {string} Group title
-        *     type: {string} Group type
-        *     filters: {string[]} Filters in the group
-        *   }
-        * }
+        * Get the object that defines groups by their name.
         *
         * @return {Object} Filter groups
         */
        };
 
        /**
-        * Get the current state of the filters
+        * 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 current state
+        * @return {Object} Filters selected state
         */
-       mw.rcfilters.dm.FiltersViewModel.prototype.getState = function () {
+       mw.rcfilters.dm.FiltersViewModel.prototype.getSelectedState = function () {
                var i,
                        items = this.getItems(),
                        result = {};
                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.toggleFiltersSelected( 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 () {
+       mw.rcfilters.dm.FiltersViewModel.prototype.getParametersFromFilters = function ( filterGroups ) {
                var i, filterItems, anySelected, values,
                        result = {},
-                       groupItems = this.getFilterGroups();
+                       groupItems = filterGroups || this.getFilterGroups();
 
-               $.each( groupItems, function ( group, data ) {
-                       filterItems = data.filters;
+               $.each( groupItems, function ( group, model ) {
+                       filterItems = model.getItems();
 
-                       if ( data.type === 'send_unselected_if_any' ) {
+                       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
                                        result[ filterItems[ i ].getName() ] = anySelected ?
                                                Number( !filterItems[ i ].isSelected() ) : 0;
                                }
-                       } else if ( data.type === 'string_options' ) {
+                       } else if ( model.getType() === 'string_options' ) {
                                values = [];
                                for ( i = 0; i < filterItems.length; i++ ) {
                                        if ( filterItems[ i ].isSelected() ) {
                                if ( values.length === 0 || values.length === filterItems.length ) {
                                        result[ group ] = 'all';
                                } else {
-                                       result[ group ] = values.join( data.separator );
+                                       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: Number( 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.groups[ groupName ].filters.map( function ( filterItem ) {
+                       validNames = this.getGroupFilters( groupName ).map( function ( filterItem ) {
                                return filterItem.getName();
                        } );
 
                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 () {
+               // Check if there are either any selected items or any items
+               // that have highlight enabled
+               return !this.getItems().some( function ( filterItem ) {
+                       return filterItem.isSelected() || filterItem.isHighlighted();
+               } );
+       };
+
+       /**
+        * 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 parameters and translates into a selected/unselected value in the filters.
+        * the given parameters and translates into a selected/unselected value in the filters.
         *
         * @param {Object} params Parameters query object
         * @return {Object} Filter state object
                var i, filterItem,
                        groupMap = {},
                        model = this,
-                       base = this.getParametersFromFilters(),
-                       // Start with current state
-                       result = this.getState();
+                       base = this.getDefaultParams(),
+                       result = {};
 
                params = $.extend( {}, base, params );
 
                        filterItem = model.getItemByName( paramName );
                        // Ignore if no filter item exists
                        if ( filterItem ) {
-                               groupMap[ filterItem.getGroup() ] = groupMap[ filterItem.getGroup() ] || {};
+                               groupMap[ filterItem.getGroupName() ] = groupMap[ filterItem.getGroupName() ] || {};
 
                                // Mark the group if it has any items that are selected
-                               groupMap[ filterItem.getGroup() ].hasSelected = (
-                                       groupMap[ filterItem.getGroup() ].hasSelected ||
+                               groupMap[ filterItem.getGroupName() ].hasSelected = (
+                                       groupMap[ filterItem.getGroupName() ].hasSelected ||
                                        !!Number( paramValue )
                                );
 
                                // Add the relevant filter into the group map
-                               groupMap[ filterItem.getGroup() ].filters = groupMap[ filterItem.getGroup() ].filters || [];
-                               groupMap[ filterItem.getGroup() ].filters.push( filterItem );
+                               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 ].filters };
+                               groupMap[ paramName ] = { filters: model.groups[ paramName ].getItems() };
                        }
                } );
 
                        var paramValues, filterItem,
                                allItemsInGroup = data.filters;
 
-                       if ( model.groups[ group ].type === 'send_unselected_if_any' ) {
+                       if ( model.groups[ group ].getType() === 'send_unselected_if_any' ) {
                                for ( i = 0; i < allItemsInGroup.length; i++ ) {
                                        filterItem = allItemsInGroup[ i ];
 
                                                // group, which means the state is false
                                                false;
                                }
-                       } else if ( model.groups[ group ].type === 'string_options' ) {
-                               paramValues = model.sanitizeStringOptionGroup( group, params[ group ].split( model.groups[ group ].separator ) );
+                       } 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 ];
                                                        // If it is the word 'all'
                                                        paramValues.length === 1 && paramValues[ 0 ] === 'all' ||
                                                        // All values are written
-                                                       paramValues.length === model.groups[ group ].filters.length
+                                                       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
                } )[ 0 ];
        };
 
+       /**
+        * Set all filters to false or empty/all
+        * This is equivalent to display all.
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.emptyAllFilters = function () {
+               this.getItems().forEach( function ( filterItem ) {
+                       this.toggleFilterSelected( filterItem.getName(), false );
+               }.bind( this ) );
+       };
+
+       /**
+        * Toggle selected state of one item
+        *
+        * @param {string} name Name of the filter item
+        * @param {boolean} [isSelected] Filter selected state
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.toggleFilterSelected = function ( name, isSelected ) {
+               this.getItemByName( name ).toggleSelected( isSelected );
+       };
+
        /**
         * Toggle selected state of items by their names
         *
         * @param {Object} filterDef Filter definitions
         */
-       mw.rcfilters.dm.FiltersViewModel.prototype.updateFilters = function ( filterDef ) {
-               var name, filterItem;
+       mw.rcfilters.dm.FiltersViewModel.prototype.toggleFiltersSelected = function ( filterDef ) {
+               Object.keys( filterDef ).forEach( function ( name ) {
+                       this.toggleFilterSelected( name, filterDef[ name ] );
+               }.bind( this ) );
+       };
 
-               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} str Search 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 ( str ) {
+       mw.rcfilters.dm.FiltersViewModel.prototype.findMatches = function ( query ) {
                var i,
+                       groupTitle,
                        result = {},
                        items = this.getItems();
 
                // Normalize so we can search strings regardless of case
-               str = str.toLowerCase();
+               query = query.toLowerCase();
+
+               // item label starting with the query string
                for ( i = 0; i < items.length; i++ ) {
-                       if ( items[ i ].getLabel().toLowerCase().indexOf( str ) > -1 ) {
-                               result[ items[ i ].getGroup() ] = result[ items[ i ].getGroup() ] || [];
-                               result[ items[ i ].getGroup() ].push( items[ i ] );
+                       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/images/pending.gif b/resources/src/mediawiki.rcfilters/images/pending.gif
new file mode 100644 (file)
index 0000000..1194eed
Binary files /dev/null and b/resources/src/mediawiki.rcfilters/images/pending.gif differ
index ea44b8b..e562057 100644 (file)
@@ -1,14 +1,14 @@
-( function ( mw ) {
+( function ( mw, $ ) {
        /**
         * Controller for the filters in Recent Changes
         *
-        * @param {mw.rcfilters.dm.FiltersViewModel} model View model
+        * @param {mw.rcfilters.dm.FiltersViewModel} filtersModel Filters view model
+        * @param {mw.rcfilters.dm.ChangesListViewModel} changesListModel Changes list view model
         */
-       mw.rcfilters.Controller = function MwRcfiltersController( model ) {
-               this.model = model;
-
-               // TODO: When we are ready, update the URL when a filter is updated
-               // this.model.connect( this, { itemUpdate: 'updateURL' } );
+       mw.rcfilters.Controller = function MwRcfiltersController( filtersModel, changesListModel ) {
+               this.filtersModel = filtersModel;
+               this.changesListModel = changesListModel;
+               this.requestCounter = 0;
        };
 
        /* Initialization */
 
        /**
         * Initialize the filter and parameter states
+        *
+        * @param {Object} filterStructure Filter definition and structure for the model
+        */
+       mw.rcfilters.Controller.prototype.initialize = function ( filterStructure ) {
+               // Initialize the model
+               this.filtersModel.initializeFilters( filterStructure );
+               this.updateStateBasedOnUrl();
+       };
+
+       /**
+        * Update filter state (selection and highlighting) based
+        * on current URL and default values.
         */
-       mw.rcfilters.Controller.prototype.initialize = function () {
+       mw.rcfilters.Controller.prototype.updateStateBasedOnUrl = function () {
                var uri = new mw.Uri();
 
-               this.model.updateFilters(
-                       // Translate the url params to filter select states
-                       this.model.getFiltersFromParameters( uri.query )
+               // Set filter states based on defaults and URL params
+               this.filtersModel.toggleFiltersSelected(
+                       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 ) {
+                               filterItem.setHighlightColor( color );
+                       } else {
+                               filterItem.clearHighlightColor();
+                       }
+               } );
+
+               // Check all filter interactions
+               this.filtersModel.reassessFilterInteractions();
        };
 
        /**
-        * Update the state of a filter
+        * Reset to default filters
+        */
+       mw.rcfilters.Controller.prototype.resetToDefaults = function () {
+               this.filtersModel.setFiltersToDefaults();
+               this.filtersModel.clearAllHighlightColors();
+               // Check all filter interactions
+               this.filtersModel.reassessFilterInteractions();
+
+               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.updateChangesList();
+       };
+
+       /**
+        * Update the selected state of a filter
         *
         * @param {string} filterName Filter name
-        * @param {boolean} isSelected Filter selected state
+        * @param {boolean} [isSelected] Filter selected state
         */
-       mw.rcfilters.Controller.prototype.updateFilter = function ( filterName, isSelected ) {
-               var obj = {};
+       mw.rcfilters.Controller.prototype.toggleFilterSelect = function ( filterName, isSelected ) {
+               var filterItem = this.filtersModel.getItemByName( filterName );
+
+               isSelected = isSelected === undefined ? !filterItem.isSelected() : isSelected;
 
-               obj[ filterName ] = isSelected;
-               this.model.updateFilters( obj );
+               if ( filterItem.isSelected() !== isSelected ) {
+                       this.filtersModel.toggleFilterSelected( filterName, isSelected );
+
+                       this.updateChangesList();
+
+                       // Check filter interactions
+                       this.filtersModel.reassessFilterInteractions( filterItem );
+               }
        };
 
        /**
         * Update the URL of the page to reflect current filters
+        *
+        * This should not be called directly from outside the controller.
+        * If an action requires changing the URL, it should either use the
+        * highlighting actions below, or call #updateChangesList which does
+        * the uri corrections already.
+        *
+        * @private
+        * @param {Object} [params] Extra parameters to add to the API call
         */
-       mw.rcfilters.Controller.prototype.updateURL = function () {
-               var uri = new mw.Uri();
+       mw.rcfilters.Controller.prototype.updateURL = function ( params ) {
+               var updatedUri,
+                       notEquivalent = function ( obj1, obj2 ) {
+                               var keys = Object.keys( obj1 ).concat( Object.keys( obj2 ) );
+                               return keys.some( function ( key ) {
+                                       return obj1[ key ] != obj2[ key ]; // eslint-disable-line eqeqeq
+                               } );
+                       };
+
+               params = params || {};
+
+               updatedUri = this.getUpdatedUri();
+               updatedUri.extend( params );
+
+               if ( notEquivalent( updatedUri.query, new mw.Uri().query ) ) {
+                       window.history.pushState( { tag: 'rcfilters' }, document.title, updatedUri.toString() );
+               }
+       };
+
+       /**
+        * 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.model.getParametersFromFilters() );
+               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
+        *  or with a string denoting no results.
+        */
+       mw.rcfilters.Controller.prototype.fetchChangesList = function () {
+               var uri = this.getUpdatedUri(),
+                       requestId = ++this.requestCounter,
+                       latestRequest = function () {
+                               return requestId === this.requestCounter;
+                       }.bind( this );
+
+               return $.ajax( uri.toString(), { contentType: 'html' } )
+                       .then(
+                               // Success
+                               function ( html ) {
+                                       var $parsed;
+                                       if ( !latestRequest() ) {
+                                               return $.Deferred().reject();
+                                       }
+
+                                       $parsed = $( $.parseHTML( html ) );
+
+                                       return {
+                                               // Changes list
+                                               changes: $parsed.find( '.mw-changeslist' ).first().contents(),
+                                               // Fieldset
+                                               fieldset: $parsed.find( 'fieldset.rcoptions' ).first()
+                                       };
+                               },
+                               // Failure
+                               function ( responseObj ) {
+                                       var $parsed;
 
-               // Update the URL itself
-               window.history.pushState( { tag: 'rcfilters' }, document.title, uri.toString() );
+                                       if ( !latestRequest() ) {
+                                               return $.Deferred().reject();
+                                       }
+
+                                       $parsed = $( $.parseHTML( responseObj.responseText ) );
+
+                                       // Force a resolve state to this promise
+                                       return $.Deferred().resolve( {
+                                               changes: 'NO_RESULTS',
+                                               fieldset: $parsed.find( 'fieldset.rcoptions' ).first()
+                                       } ).promise();
+                               }
+                       );
+       };
+
+       /**
+        * Update the list of changes and notify the model
+        *
+        * @param {Object} [params] Extra parameters to add to the API call
+        */
+       mw.rcfilters.Controller.prototype.updateChangesList = function ( params ) {
+               this.updateURL( params );
+               this.changesListModel.invalidate();
+               this.fetchChangesList()
+                       .then(
+                               // Success
+                               function ( pieces ) {
+                                       var $changesListContent = pieces.changes,
+                                               $fieldset = pieces.fieldset;
+                                       this.changesListModel.update( $changesListContent, $fieldset );
+                               }.bind( this )
+                               // Do nothing for failure
+                       );
+       };
+
+       /**
+        * 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();
+       };
+
+       /**
+        * Clear both highlight and selection of a filter
+        *
+        * @param {string} filterName Name of the filter item
+        */
+       mw.rcfilters.Controller.prototype.clearFilter = function ( filterName ) {
+               var filterItem = this.filtersModel.getItemByName( filterName );
+
+               if ( filterItem.isSelected() || filterItem.isHighlighted() ) {
+                       this.filtersModel.clearHighlightColor( filterName );
+                       this.filtersModel.toggleFilterSelected( filterName, false );
+                       this.updateChangesList();
+                       this.filtersModel.reassessFilterInteractions( filterItem );
+               }
+       };
+
+       /**
+        * Synchronize the URL with the current state of the filters
+        * without adding an history entry.
+        */
+       mw.rcfilters.Controller.prototype.replaceUrl = function () {
+               window.history.replaceState(
+                       { tag: 'rcfilters' },
+                       document.title,
+                       this.getUpdatedUri().toString()
+               );
        };
-}( mediaWiki ) );
+}( 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 ) );
index 679215b..a0b785d 100644 (file)
@@ -9,32 +9,37 @@
        var rcfilters = {
                /** */
                init: function () {
-                       var model = new mw.rcfilters.dm.FiltersViewModel(),
-                               controller = new mw.rcfilters.Controller( model ),
-                               widget = new mw.rcfilters.ui.FilterWrapperWidget( controller, model );
+                       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 } );
 
-                       model.initializeFilters( {
-                               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.
+                       // TODO: The changesListWrapperWidget should be able to initialize
+                       // after the model is ready.
+                       // eslint-disable-next-line no-new
+                       new mw.rcfilters.ui.ChangesListWrapperWidget(
+                               filtersModel, changesListModel, $( '.mw-changeslist, .mw-changeslist-empty' ) );
+
+                       controller.initialize( {
+                               registration: {
+                                       title: mw.msg( 'rcfilters-filtergroup-registration' ),
                                        type: 'send_unselected_if_any',
+                                       fullCoverage: true,
                                        filters: [
                                                {
-                                                       name: 'hidemyself',
-                                                       label: mw.msg( 'rcfilters-filter-editsbyself-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-editsbyself-description' )
+                                                       name: 'hideliu',
+                                                       label: mw.msg( 'rcfilters-filter-registered-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-registered-description' ),
+                                                       'class': 'mw-changeslist-liu'
                                                },
                                                {
-                                                       name: 'hidebyothers',
-                                                       label: mw.msg( 'rcfilters-filter-editsbyother-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-editsbyother-description' )
+                                                       name: 'hideanons',
+                                                       label: mw.msg( 'rcfilters-filter-unregistered-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-unregistered-description' ),
+                                                       'class': 'mw-changeslist-anon'
                                                }
                                        ]
                                },
                                        // ** 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' )
+                                                       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' )
+                                                       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' )
+                                                       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( widget.$element );
-
-                       // Initialize values
-                       controller.initialize();
+                       // eslint-disable-next-line no-new
+                       new mw.rcfilters.ui.FormWrapperWidget(
+                               filtersModel, changesListModel, controller, $( 'fieldset.rcoptions' ) );
 
-                       $( '.rcoptions form' ).submit( function () {
-                               var $form = $( this );
+                       $( '.rcfilters-container' ).append( filtersWidget.$element );
+                       $( 'body' ).append( $overlay );
 
-                               // Get current filter values
-                               $.each( model.getParametersFromFilters(), function ( paramName, paramValue ) {
-                                       var $existingInput = $form.find( 'input[name=' + paramName + ']' );
-                                       // Check if the hidden input already exists
-                                       // This happens if the parameter was already given
-                                       // on load
-                                       if ( $existingInput.length ) {
-                                               // Update the value
-                                               $existingInput.val( paramValue );
-                                       } else {
-                                               // Append hidden fields with filter values
-                                               $form.append(
-                                                       $( '<input>' )
-                                                               .attr( 'type', 'hidden' )
-                                                               .attr( 'name', paramName )
-                                                               .val( paramValue )
-                                               );
-                                       }
-                               } );
+                       // Set as ready
+                       $( '.rcfilters-head' ).addClass( 'mw-rcfilters-ui-ready' );
 
-                               // Continue the submission process
-                               return true;
+                       window.addEventListener( 'popstate', function () {
+                               controller.updateStateBasedOnUrl();
+                               controller.updateChangesList();
                        } );
+
+                       $( 'a.mw-helplink' ).attr(
+                               'href',
+                               'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:New_filters_for_edit_review'
+                       );
+
+                       controller.replaceUrl();
                }
        };
 
index 7f71c0c..d47346c 100644 (file)
@@ -1,5 +1,33 @@
-.rcshowhidemine {
-       // HACK: Hide this filter since it already appears in
-       // the new filter drop-down.
-       display: none;
+// Corrections for the standard special page
+.client-js{
+       .rcoptions {
+               border: 0;
+               border-bottom: 1px solid #a2a9b1;
+
+               legend {
+                       display: none;
+               }
+       }
+
+       .rcfilters-head {
+               min-height: 270px;
+               &:not( .mw-rcfilters-ui-ready ) {
+                       /* @embed */
+                       background-image: url( ../images/pending.gif );
+                       margin: 0;
+
+                       * {
+                               visibility: hidden;
+                       }
+               }
+       }
+
+       .rcfilters-container {
+               min-height: 100px;
+               margin: 0;
+       }
+}
+
+.mw-rcfilters-staticfilters-selected {
+       font-weight: bold;
 }
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..2ce2c7f
--- /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..b16e84c
--- /dev/null
@@ -0,0 +1,75 @@
+@import 'mw.rcfilters.mixins';
+
+.mw-rcfilters-ui-capsuleItemWidget {
+       background-color: #fff;
+       border-color: #979797;
+       color: #222;
+
+       // Background and color of the capsule widget need a bit
+       // more specificity to override ooui internals
+       &-muted.oo-ui-capsuleItemWidget.oo-ui-widget-enabled {
+               // Muted state
+               background-color: #eaecf0;
+               border-color: #c8ccd1;
+
+               .oo-ui-labelElement-label {
+                       color: #72777d;
+               }
+               .oo-ui-buttonWidget {
+                       opacity: @muted-opacity;
+               }
+       }
+
+       &-conflicted.oo-ui-capsuleItemWidget.oo-ui-widget-enabled {
+               background-color: #fee7e6; // Red90 AAA
+               border-color: #b32424; // Red30 AAA
+
+               .oo-ui-labelElement-label {
+                       color: #b32424;
+               }
+               .oo-ui-buttonWidget {
+                       opacity: @muted-opacity;
+               }
+       }
+
+       &-selected.oo-ui-capsuleItemWidget.oo-ui-widget-enabled {
+               background-color: #eaf3ff;
+               border-color: #36c;
+       }
+
+       &-popup-content {
+               padding: 0.5em;
+               color: #54595d;
+       }
+
+       &.oo-ui-labelElement .oo-ui-labelElement-label {
+               vertical-align: middle;
+               cursor: pointer;
+       }
+
+       &-highlight {
+               display: none;
+               padding-right: 0.5em;
+
+               &-highlighted {
+                       display: inline-block;
+
+               }
+
+               &[data-color='c1'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c1, 10px, ~'0 0.5em 0 0' );
+               }
+               &[data-color='c2'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c2, 10px, ~'0 0.5em 0 0' );
+               }
+               &[data-color='c3'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c3, 10px, ~'0 0.5em 0 0' );
+               }
+               &[data-color='c4'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c4, 10px, ~'0 0.5em 0 0' );
+               }
+               &[data-color='c5'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c5, 10px, ~'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..c18fe5e
--- /dev/null
@@ -0,0 +1,129 @@
+@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} )';
+
+                       li {
+                               list-style: none;
+                       }
+               }
+       }
+
+       // Correction for Enhanced RC
+       // This is outside the scope of the 'highlights' wrapper
+       table.mw-enhanced-rc {
+               margin-left: ~'calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )';
+
+               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% );
+       }
+}
index 4e55add..a0ef293 100644 (file)
@@ -1,11 +1,28 @@
 .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;
        }
 
-       .oo-ui-capsuleItemWidget {
-               color: #222;
-               background-color: #fff;
+       &-emptyFilters {
+               color: #72777d;
+       }
+
+       &-cell-filters {
+               width: 100%;
+       }
+       &-cell-reset {
+               text-align: right;
+               padding-left: 0.5em;
        }
 }
index 70982d4..83491ac 100644 (file)
@@ -1,3 +1,5 @@
+@import 'mediawiki.mixins';
+
 .mw-rcfilters-ui-filterGroupWidget {
        padding-bottom: 0.5em;
 
@@ -6,15 +8,12 @@
                background: #eaecf0;
                padding: 0.5em 0.75em;
                color: #555a5d;
+               .box-sizing( border-box );
        }
 
-       &-invalid-notice {
-               padding: 0.5em;
-               font-style: italic;
-               display: none;
-
-               .mw-rcfilters-ui-filterGroupWidget-invalid & {
-                       display: block;
+       &-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..198f599
--- /dev/null
@@ -0,0 +1,30 @@
+@import 'mw.rcfilters.mixins';
+
+.mw-rcfilters-ui-filterItemHighlightButton {
+       .oo-ui-buttonWidget.oo-ui-popupButtonWidget .oo-ui-buttonElement-button > &-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.2em 0 );
+                       }
+                       &-c2 {
+                               .mw-rcfilters-mixin-circle( @highlight-c2, 1.875em, 0.2em 0 );
+                       }
+                       &-c3 {
+                               .mw-rcfilters-mixin-circle( @highlight-c3, 1.875em, 0.2em 0 );
+                       }
+                       &-c4 {
+                               .mw-rcfilters-mixin-circle( @highlight-c4, 1.875em, 0.2em 0 );
+                       }
+                       &-c5 {
+                               .mw-rcfilters-mixin-circle( @highlight-c5, 1.875em, 0.2em 0 );
+                       }
+               }
+       }
+}
index ad0b816..0e38942 100644 (file)
@@ -1,10 +1,37 @@
+@import 'mediawiki.mixins';
+
 .mw-rcfilters-ui-filterItemWidget {
-       padding-left: 0.5em;
+       padding: 0 0.5em;
+       .box-sizing( border-box );
+
+       &:not( :last-child ) {
+               border-bottom: solid 1px #eaecf0; // Base 80 AAA
+       }
+
+       &:hover {
+               background-color: #fbfbfb;
+       }
+
+       .mw-rcfilters-ui-table {
+               padding-top: 0.5em;
+       }
+
+       &-muted {
+               background-color: #f8f9fa; // Base90 AAA
+               .mw-rcfilters-ui-filterItemWidget-label-title,
+               .mw-rcfilters-ui-filterItemWidget-label-desc {
+                       color: #54595d; // Base20 AAA
+               }
+       }
+
+       &-selected {
+               background-color: #eaf3ff; // Accent90 AAA
+       }
 
        &-label {
                &-title {
                        font-weight: bold;
-                       font-size: 1.2em;
+                       font-size: 1.15em;
                        color: #222;
                }
                &-desc {
                }
        }
 
-       .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
-               margin-bottom: 0 !important;
+       &-filterCheckbox {
+               .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
+                       // Override margin-top and -bottom rules from FieldLayout
+                       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
+               }
+       }
+
+       &-highlightButton {
+               width: 4em;
+               padding-left: 1em;
        }
 }
index a610e8f..970d140 100644 (file)
@@ -1,33 +1,34 @@
 .mw-rcfilters-ui-filterWrapperWidget {
        width: 100%;
-
-       .oo-ui-capsuleMultiselectWidget {
-               max-width: none;
-
-               &.oo-ui-widget-enabled .oo-ui-capsuleMultiselectWidget-handle {
-                       // TODO: Unify colors with official design palette
-                       background-color: #f8f9fa;
-                       border: 1px solid #a2a9b1;
-                       min-height: 5.5em;
-                       padding: 0.75em;
-
-               }
-       }
+       // 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: 2em !important;
+               margin-top: 2.4em !important; /* stylelint-disable-line declaration-no-important */
                max-width: 650px;
+
+               .oo-ui-popupWidget-body {
+                       max-height: 70vh;
+               }
+
+               .oo-ui-popupWidget-footer {
+                       background-color: #f8f9fa;
+                       text-align: right;
+                       padding: 0.5em;
+               }
        }
 
        &-search {
                max-width: none;
                margin-top: -0.5em;
-       }
 
-       &-capsule-invalid-filter {
-               // TODO: Unify colors with official design palette
-               background: red;
+               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;
+               }
        }
 }
index b874e0f..3334d84 100644 (file)
@@ -4,8 +4,22 @@
                padding: 0.75em;
                // TODO: Unify colors with official design palette
                color: #54595d;
+       }
+
+       &-header {
                border-bottom: 1px solid #c8ccd1;
                background: #f8f9fa;
+               overflow: hidden;
+
+               &-highlight {
+                       width: 1em;
+                       vertical-align: middle;
+               }
+
+               &-title {
+                       width: 100%;
+                       vertical-align: middle;
+               }
        }
 
        &-noresults {
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..88f1195
--- /dev/null
@@ -0,0 +1,75 @@
+@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 );
+                               // Override border to dashed
+                               border: 1px dashed #565656;
+
+                               &.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..f28523a
--- /dev/null
@@ -0,0 +1,207 @@
+( 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;
+               this.popupTimeoutShow = null;
+               this.popupTimeoutHide = null;
+
+               // 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',
+                               position: 'above',
+                               $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( 'mouseenter', this.onMouseEnter.bind( this ) )
+                       .on( 'mouseleave', this.onMouseLeave.bind( this ) );
+
+               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();
+       };
+
+       /**
+        * Emit a click event when the capsule is clicked so we can aggregate this
+        * in the parent (the capsule)
+        */
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.onClick = function () {
+               this.emit( 'click' );
+       };
+
+       /**
+        * 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.clearFilter( 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.isFullyCovered()
+                       )
+                       .toggleClass(
+                               'mw-rcfilters-ui-capsuleItemWidget-conflicted',
+                               this.model.isConflicted()
+                       );
+       };
+
+       /**
+        * Respond to mouse enter event
+        */
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.onMouseEnter = function () {
+               if ( this.model.getDescription() ) {
+                       if ( !this.positioned ) {
+                               // Recalculate anchor position to be center of the capsule item
+                               this.popup.$anchor.css( 'margin-left', ( this.$element.width() / 2 ) );
+                               this.positioned = true;
+                       }
+
+                       // Set timeout for the popup to show
+                       this.popupTimeoutShow = setTimeout( function () {
+                               this.popup.toggle( true );
+                       }.bind( this ), 500 );
+
+                       // Cancel the hide timeout
+                       clearTimeout( this.popupTimeoutHide );
+                       this.popupTimeoutHide = null;
+               }
+       };
+
+       /**
+        * Respond to mouse leave event
+        */
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.onMouseLeave = function () {
+               this.popupTimeoutHide = setTimeout( function () {
+                       this.popup.toggle( false );
+               }.bind( this ), 250 );
+
+               // Clear the show timeout
+               clearTimeout( this.popupTimeoutShow );
+               this.popupTimeoutShow = null;
+       };
+
+       /**
+        * Set selected state on this widget
+        *
+        * @param {boolean} [isSelected] Widget is selected
+        */
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.toggleSelected = function ( isSelected ) {
+               isSelected = isSelected !== undefined ? isSelected : !this.selected;
+
+               if ( this.selected !== isSelected ) {
+                       this.selected = isSelected;
+
+                       this.$element.toggleClass( 'mw-rcfilters-ui-capsuleItemWidget-selected', this.selected );
+               }
+       };
+
+       /**
+        * 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 ) );
index df6cf8b..a06b103 100644 (file)
@@ -2,33 +2,93 @@
        /**
         * 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( filterInput, config ) {
+       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( {
-                       $autoCloseIgnore: filterInput.$element
+               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.isSelecting = false;
+               this.selected = null;
 
-               this.$content.prepend(
-                       $( '<div>' )
-                               .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-content-title' )
-                               .text( mw.msg( 'rcfilters-activefilters' ) )
-               );
+               this.resetButton = new OO.ui.ButtonWidget( {
+                       icon: 'trash',
+                       framed: false,
+                       title: mw.msg( 'rcfilters-clear-all-filters' ),
+                       classes: [ 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-resetButton' ]
+               } );
+
+               this.emptyFilterMessage = new OO.ui.LabelWidget( {
+                       label: mw.msg( 'rcfilters-empty-filter' ),
+                       classes: [ 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-emptyFilters' ]
+               } );
+               this.$content.append( this.emptyFilterMessage.$element );
 
                // Events
+               this.resetButton.connect( this, { click: 'onResetButtonClick' } );
+               this.model.connect( this, {
+                       itemUpdate: 'onModelItemUpdate',
+                       highlightChange: 'onModelHighlightChange'
+               } );
+               this.aggregate( { click: 'capsuleItemClick' } );
+
                // Add the filterInput as trigger
                this.filterInput.$input
-                       .on( 'focus', this.onFocusForPopup.bind( this ) );
+                       .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 */
 
        /* 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 );
+       };
+
+       /**
+        * Mark an item widget as selected
+        *
+        * @param {mw.rcfilters.ui.CapsuleItemWidget} item Capsule widget
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.select = function ( item ) {
+               if ( this.selected !== item ) {
+                       // Unselect previous
+                       if ( this.selected ) {
+                               this.selected.toggleSelected( false );
+                       }
+
+                       // Select new one
+                       this.selected = item;
+                       if ( this.selected ) {
+                               item.toggleSelected( true );
+                       }
+               }
+       };
+
+       /**
+        * Reset selection and remove selected states from all items
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.resetSelection = function () {
+               if ( this.selected !== null ) {
+                       this.selected = null;
+                       this.getItems().forEach( function ( capsuleWidget ) {
+                               capsuleWidget.toggleSelected( false );
+                       } );
+               }
+       };
+
        /**
         * @inheritdoc
         */
-       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.onFocusForPopup = function () {
+       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.removeItems = function ( items ) {
-               // Parent
-               mw.rcfilters.ui.FilterCapsuleMultiselectWidget.parent.prototype.removeItems.call( this, items );
-
-               this.emit( 'remove', items.map( function ( item ) { return item.getData(); } ) );
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.onFocusForPopup = function () {
+               // HACK can be removed once I21b8cff4048 is merged in oojs-ui
+               this.focus();
        };
 
        /**
                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 ) );
index 92ae4d1..a750c44 100644 (file)
@@ -7,25 +7,37 @@
         * @mixins OO.ui.mixin.LabelElement
         *
         * @constructor
-        * @param {string} name Group name
+        * @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( name, config ) {
+       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;
+               this.filters = {};
+
                // 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.name = name;
+               this.model.connect( this, { update: 'onModelUpdate' } );
 
                this.$element
                        .addClass( 'mw-rcfilters-ui-filterGroupWidget' )
+                       .addClass( 'mw-rcfilters-ui-filterGroupWidget-name-' + this.model.getName() )
                        .append(
                                this.$label,
                                this.$group
        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()
+               );
+       };
+
+       /**
+        * Get an item widget from its filter name
+        *
+        * @param {string} filterName Filter name
+        * @return {mw.rcfilters.ui.FilterItemWidget} Item widget
+        */
+       mw.rcfilters.ui.FilterGroupWidget.prototype.getItemWidget = function ( filterName ) {
+               return this.filters[ filterName ];
+       };
+
+       /**
+        * Populate data from the model
+        */
+       mw.rcfilters.ui.FilterGroupWidget.prototype.populateFromModel = function () {
+               var widget = this;
+
+               this.clearItems();
+               this.filters = {};
+
+               this.addItems(
+                       this.model.getItems().map( function ( filterItem ) {
+                               var groupWidget = new mw.rcfilters.ui.FilterItemWidget(
+                                       widget.controller,
+                                       filterItem,
+                                       {
+                                               label: filterItem.getLabel(),
+                                               description: filterItem.getDescription(),
+                                               $overlay: widget.$overlay
+                                       }
+                               );
+
+                               widget.filters[ filterItem.getName() ] = groupWidget;
+
+                               return groupWidget;
+                       } )
+               );
+       };
+
        /**
         * Get the group name
         *
         * @return {string} Group name
         */
        mw.rcfilters.ui.FilterGroupWidget.prototype.getName = function () {
-               return this.name;
+               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..889ba08
--- /dev/null
@@ -0,0 +1,77 @@
+( 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: 'highlight',
+                       indicator: 'down',
+                       popup: {
+                               // TODO: There is a bug in non-anchored popups in
+                               // OOUI, so we set this popup to "anchored" until
+                               // the bug is fixed.
+                               // See: https://phabricator.wikimedia.org/T159906
+                               anchor: true,
+                               padded: true,
+                               align: 'backwards',
+                               horizontalPosition: 'end',
+                               $floatableContainer: this.$element,
+                               width: 290,
+                               $content: this.colorPickerWidget.$element
+                       }
+               } ) );
+
+               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 ) );
index b77df3b..4ea284b 100644 (file)
@@ -21,8 +21,9 @@
 
                this.controller = controller;
                this.model = model;
+               this.selected = false;
 
-               this.checkboxWidget = new OO.ui.CheckboxInputWidget( {
+               this.checkboxWidget = new mw.rcfilters.ui.CheckboxInputWidget( {
                        value: this.model.getName(),
                        selected: this.model.isSelected()
                } );
                        );
                }
 
+               this.highlightButton = new mw.rcfilters.ui.FilterItemHighlightButton(
+                       this.controller,
+                       this.model,
+                       {
+                               $overlay: config.$overlay || this.$element,
+                               title: mw.msg( 'rcfilters-highlightmenu-help' )
+                       }
+               );
+               this.highlightButton.toggle( this.model.isHighlightEnabled() );
+
                layout = new OO.ui.FieldLayout( this.checkboxWidget, {
                        label: $label,
                        align: 'inline'
                } );
 
                // Event
-               this.checkboxWidget.connect( this, { change: 'onCheckboxChange' } );
+               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(
-                               layout.$element
+                               $( '<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 )
+                                                       )
+                                       )
                        );
        };
 
@@ -70,7 +95,7 @@
         * @param {boolean} isSelected The checkbox is selected
         */
        mw.rcfilters.ui.FilterItemWidget.prototype.onCheckboxChange = function ( isSelected ) {
-               this.controller.updateFilter( this.model.getName(), isSelected );
+               this.controller.toggleFilterSelect( this.model.getName(), isSelected );
        };
 
        /**
         */
        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 selected state on this widget
+        *
+        * @param {boolean} [isSelected] Widget is selected
+        */
+       mw.rcfilters.ui.FilterItemWidget.prototype.toggleSelected = function ( isSelected ) {
+               isSelected = isSelected !== undefined ? isSelected : !this.selected;
+
+               if ( this.selected !== isSelected ) {
+                       this.selected = isSelected;
+
+                       this.$element.toggleClass( 'mw-rcfilters-ui-filterItemWidget-selected', this.selected );
+               }
+       };
+
+       /**
+        * 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() ||
+                       (
+                               // 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() );
        };
 
        /**
        mw.rcfilters.ui.FilterItemWidget.prototype.getName = function () {
                return this.model.getName();
        };
-
 }( mediaWiki, jQuery ) );
index 3fcfc47..e64a4c0 100644 (file)
@@ -8,10 +8,12 @@
         * @constructor
         * @param {mw.rcfilters.Controller} controller Controller
         * @param {mw.rcfilters.dm.FiltersViewModel} model View model
-        * @param {Object} config Configuration object
+        * @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 ) {
+               var $footer = $( '<div>' );
                config = config || {};
 
                // Parent
 
                this.controller = controller;
                this.model = model;
-               this.filtersInCapsule = [];
+               this.$overlay = config.$overlay || this.$element;
 
                this.filterPopup = new mw.rcfilters.ui.FiltersListWidget(
                        this.controller,
                        this.model,
                        {
-                               label: mw.msg( 'rcfilters-filterlist-title' )
+                               label: mw.msg( 'rcfilters-filterlist-title' ),
+                               $overlay: this.$overlay
                        }
                );
 
+               $footer.append(
+                       new OO.ui.ButtonWidget( {
+                               framed: false,
+                               icon: 'feedback',
+                               flags: [ 'progressive' ],
+                               label: mw.msg( 'rcfilters-filterlist-feedbacklink' ),
+                               href: 'https://www.mediawiki.org/wiki/Help_talk:New_filters_for_edit_review'
+                       } ).$element
+               );
+
                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( this.textInput, {
+               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' ]
+                               $footer: $footer,
+                               classes: [ 'mw-rcfilters-ui-filterWrapperWidget-popup' ],
+                               width: 650,
+                               hideWhenOutOfView: false
                        }
                } );
 
                        itemUpdate: 'onModelItemUpdate'
                } );
                this.textInput.connect( this, {
-                       change: 'onTextInputChange'
-               } );
-               this.capsule.connect( this, {
-                       remove: 'onCapsuleRemoveItem'
+                       change: 'onTextInputChange',
+                       enter: 'onTextInputEnter'
                } );
+               this.capsule.connect( this, { capsuleItemClick: 'onCapsuleItemClick' } );
+               this.capsule.popup.connect( this, { toggle: 'onCapsulePopupToggle' } );
 
+               // Initialize
                this.$element
                        .addClass( 'mw-rcfilters-ui-filterWrapperWidget' )
                        .append( this.capsule.$element, this.textInput.$element );
        OO.inheritClass( mw.rcfilters.ui.FilterWrapperWidget, OO.ui.Widget );
        OO.mixinClass( mw.rcfilters.ui.FilterWrapperWidget, OO.ui.mixin.PendingElement );
 
+       /**
+        * Respond to capsule item click and make the popup scroll down to the requested item
+        *
+        * @param {mw.rcfilters.ui.CapsuleItemWidget} item Clicked item
+        */
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.onCapsuleItemClick = function ( item ) {
+               var filterName = item.getData(),
+                       // Find the item in the popup
+                       filterWidget = this.filterPopup.getItemWidget( filterName );
+
+               // Highlight item
+               this.filterPopup.select( filterName );
+               this.capsule.select( item );
+
+               this.scrollToTop( filterWidget.$element );
+       };
+
+       /**
+        * Respond to popup toggle event. Reset selection in the list when the popup is closed.
+        *
+        * @param {boolean} isVisible Popup is visible
+        */
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.onCapsulePopupToggle = function ( isVisible ) {
+               if ( !isVisible ) {
+                       if ( !this.textInput.getValue() ) {
+                               // Only reset selection if we are not filtering
+                               this.filterPopup.resetSelection();
+                               this.capsule.resetSelection();
+                       }
+               } else {
+                       this.scrollToTop( this.capsule.$element, 10 );
+               }
+       };
+
        /**
         * Respond to text input change
         *
        mw.rcfilters.ui.FilterWrapperWidget.prototype.onTextInputChange = function ( newValue ) {
                // Filter the results
                this.filterPopup.filter( this.model.findMatches( newValue ) );
+
+               if ( !newValue ) {
+                       // If the value is empty, we didn't actually
+                       // filter anything. the filter method will run
+                       // and show all, but then will select the
+                       // top item - but in this case, no selection
+                       // should be made.
+                       this.filterPopup.resetSelection();
+               }
+               this.capsule.popup.clip();
        };
 
        /**
-        * Respond to an event where an item is removed from the capsule.
-        * This is the case where a user actively removes a filter box from the capsule widget.
-        *
-        * @param {string[]} filterNames An array of filter names that were removed
+        * Respond to text input enter event
         */
-       mw.rcfilters.ui.FilterWrapperWidget.prototype.onCapsuleRemoveItem = function ( filterNames ) {
-               var filterItem,
-                       widget = this;
-
-               filterNames.forEach( function ( filterName ) {
-                       // Go over filters
-                       filterItem = widget.model.getItemByName( filterName );
-                       filterItem.toggleSelected( false );
-               } );
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.onTextInputEnter = function () {
+               var filter = this.filterPopup.getSelectedFilter();
+
+               // Toggle the filter
+               this.controller.toggleFilterSelect( filter );
        };
 
        /**
         * from.
         */
        mw.rcfilters.ui.FilterWrapperWidget.prototype.onModelInitialize = function () {
-               var items,
-                       filters = this.model.getItems();
-
-               // Reset
-               this.capsule.getMenu().clearItems();
-
-               // Insert hidden options for the capsule to get its item data from
-               items = filters.map( function ( filterItem ) {
-                       return new OO.ui.MenuOptionWidget( {
-                               data: filterItem.getName(),
-                               label: filterItem.getLabel()
-                       } );
+               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() );
+                       }
                } );
+       };
 
-               this.capsule.getMenu().addItems( items );
+       /**
+        * Respond to item update and reset the selection. This will make it so that
+        * any actual interaction with the system resets the selection state of any item.
+        */
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.onModelItemUpdate = function () {
+               if ( !this.textInput.getValue() ) {
+                       this.filterPopup.resetSelection();
+               }
        };
 
        /**
-        * Respond to model item update
+        * Scroll the element to top within its container
         *
-        * @param {mw.rcfilters.dm.FilterItem} item Filter item that was updated
+        * @private
+        * @param {jQuery} $element Element to position
+        * @param {number} [marginFromTop] When scrolling the entire widget to the top, leave this
+        *  much space (in pixels) above the widget.
         */
-       mw.rcfilters.ui.FilterWrapperWidget.prototype.onModelItemUpdate = function ( item ) {
-               if ( item.isSelected() ) {
-                       this.capsule.addItemsFromData( [ item.getName() ] );
-               } else {
-                       this.capsule.removeItemsFromData( [ item.getName() ] );
-               }
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.scrollToTop = function ( $element, marginFromTop ) {
+               var container = OO.ui.Element.static.getClosestScrollableContainer( $element[ 0 ], 'y' ),
+                       pos = OO.ui.Element.static.getRelativePosition( $element, $( container ) ),
+                       containerScrollTop = $( container ).is( 'body, html' ) ? 0 : $( container ).scrollTop();
+
+               // Scroll to item
+               $( container ).animate( {
+                       scrollTop: containerScrollTop + pos.top - ( marginFromTop || 0 )
+               } );
        };
 }( mediaWiki ) );
index f5ec1fc..4011e6d 100644 (file)
 
                this.controller = controller;
                this.model = model;
+               this.$overlay = config.$overlay || this.$element;
+               this.groups = {};
+               this.selected = null;
+
+               this.highlightButton = new OO.ui.ToggleButtonWidget( {
+                       icon: 'highlight',
+                       label: mw.message( 'rcfilters-highlightbutton-title' ).text(),
+                       classes: [ 'mw-rcfilters-ui-filtersListWidget-hightlightButton' ]
+               } );
 
                this.noResultsLabel = new OO.ui.LabelWidget( {
                        label: mw.msg( 'rcfilters-filterlist-noresults' ),
                } );
 
                // Events
+               this.highlightButton.connect( this, { click: 'onHighlightButtonClick' } );
                this.model.connect( this, {
-                       initialize: 'onModelInitialize'
+                       initialize: 'onModelInitialize',
+                       highlightChange: 'onModelHighlightChange'
                } );
 
                // Initialize
                this.$element
                        .addClass( 'mw-rcfilters-ui-filtersListWidget' )
                        .append(
-                               this.$label,
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-table' )
+                                       .addClass( 'mw-rcfilters-ui-filtersListWidget-header' )
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-row' )
+                                                       .append(
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-cell' )
+                                                                       .addClass( 'mw-rcfilters-ui-filtersListWidget-header-title' )
+                                                                       .append( this.$label ),
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-cell' )
+                                                                       .addClass( 'mw-rcfilters-ui-filtersListWidget-header-highlight' )
+                                                                       .append( this.highlightButton.$element )
+                                                       )
+                                       ),
+                               // this.$label,
                                this.$group
                                        .addClass( 'mw-rcfilters-ui-filtersListWidget-group' ),
                                this.noResultsLabel.$element
         * Respond to initialize event from the model
         */
        mw.rcfilters.ui.FiltersListWidget.prototype.onModelInitialize = function () {
-               var i, group, groupWidget,
-                       itemWidgets = [],
-                       groupWidgets = [],
-                       groups = this.model.getFilterGroups();
+               var widget = this;
 
                // Reset
                this.clearItems();
+               this.groups = {};
 
-               for ( group in groups ) {
-                       groupWidget = new mw.rcfilters.ui.FilterGroupWidget( group, {
-                               label: groups[ group ].title
-                       } );
-                       groupWidgets.push( groupWidget );
-
-                       itemWidgets = [];
-                       if ( groups[ group ].filters ) {
-                               for ( i = 0; i < groups[ group ].filters.length; i++ ) {
-                                       itemWidgets.push(
-                                               new mw.rcfilters.ui.FilterItemWidget(
-                                                       this.controller,
-                                                       groups[ group ].filters[ i ],
-                                                       {
-                                                               label: groups[ group ].filters[ i ].getLabel(),
-                                                               description: groups[ group ].filters[ i ].getDescription()
-                                                       }
-                                               )
-                                       );
-                               }
+               this.addItems(
+                       Object.keys( this.model.getFilterGroups() ).map( function ( groupName ) {
+                               var groupWidget = new mw.rcfilters.ui.FilterGroupWidget(
+                                       widget.controller,
+                                       widget.model.getGroup( groupName ),
+                                       {
+                                               $overlay: widget.$overlay
+                                       }
+                               );
+
+                               widget.groups[ groupName ] = groupWidget;
+                               return groupWidget;
+                       } )
+               );
+       };
+
+       /**
+        * Respond to model highlight change event
+        *
+        * @param {boolean} highlightEnabled Highlight is enabled
+        */
+       mw.rcfilters.ui.FiltersListWidget.prototype.onModelHighlightChange = function ( highlightEnabled ) {
+               this.highlightButton.setActive( highlightEnabled );
+       };
+
+       /**
+        * Respond to highlight button click
+        */
+       mw.rcfilters.ui.FiltersListWidget.prototype.onHighlightButtonClick = function () {
+               this.controller.toggleHighlight();
+       };
+
+       /**
+        * Find the filter item widget that corresponds to the item name
+        *
+        * @param {string} itemName Filter name
+        * @return {mw.rcfilters.ui.FilterItemWidget} Filter widget
+        */
+       mw.rcfilters.ui.FiltersListWidget.prototype.getItemWidget = function ( itemName ) {
+               var filterItem = this.model.getItemByName( itemName ),
+                       // Find the group
+                       groupWidget = this.groups[ filterItem.getGroupName() ];
+
+               // Find the item inside the group
+               return groupWidget.getItemWidget( itemName );
+       };
 
-                               groupWidget.addItems( itemWidgets );
+       /**
+        * Get the current selection
+        *
+        * @return {string|null} Selected filter. Null if none is selected.
+        */
+       mw.rcfilters.ui.FiltersListWidget.prototype.getSelectedFilter = function () {
+               return this.selected;
+       };
+
+       /**
+        * Mark an item widget as selected
+        *
+        * @param {string} itemName Filter name
+        */
+       mw.rcfilters.ui.FiltersListWidget.prototype.select = function ( itemName ) {
+               var filterWidget;
+
+               if ( this.selected !== itemName ) {
+                       // Unselect previous
+                       if ( this.selected ) {
+                               filterWidget = this.getItemWidget( this.selected );
+                               filterWidget.toggleSelected( false );
+                       }
+
+                       // Select new one
+                       this.selected = itemName;
+                       if ( this.selected ) {
+                               filterWidget = this.getItemWidget( this.selected );
+                               filterWidget.toggleSelected( true );
                        }
                }
+       };
 
-               this.addItems( groupWidgets );
+       /**
+        * Reset selection and remove selected states from all items
+        */
+       mw.rcfilters.ui.FiltersListWidget.prototype.resetSelection = function () {
+               if ( this.selected !== null ) {
+                       this.selected = null;
+                       this.getItems().forEach( function ( groupWidget ) {
+                               groupWidget.getItems().forEach( function ( filterItemWidget ) {
+                                       filterItemWidget.toggleSelected( false );
+                               } );
+                       } );
+               }
        };
 
        /**
         *  arranged by their group names
         */
        mw.rcfilters.ui.FiltersListWidget.prototype.filter = function ( groupItems ) {
-               var i, j, groupName, itemWidgets,
+               var i, j, groupName, itemWidgets, topItem, isVisible,
                        groupWidgets = this.getItems(),
                        hasItemWithName = function ( itemArr, name ) {
                                return !!itemArr.filter( function ( item ) {
                                } ).length;
                        };
 
+               this.resetSelection();
+
                if ( $.isEmptyObject( groupItems ) ) {
                        // No results. Hide everything, show only 'no results'
                        // message
                        // We have items to show
                        itemWidgets = groupWidgets[ i ].getItems();
                        for ( j = 0; j < itemWidgets.length; j++ ) {
+                               isVisible = hasItemWithName( groupItems[ groupName ], itemWidgets[ j ].getName() );
                                // Only show items that are in the filtered list
-                               itemWidgets[ j ].toggle(
-                                       hasItemWithName( groupItems[ groupName ], itemWidgets[ j ].getName() )
-                               );
+                               itemWidgets[ j ].toggle( isVisible );
+
+                               if ( !topItem && isVisible ) {
+                                       topItem = itemWidgets[ j ];
+                               }
                        }
                }
+
+               // Select the first item
+               if ( topItem ) {
+                       this.select( topItem.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..e914bbe
--- /dev/null
@@ -0,0 +1,155 @@
+( function ( mw ) {
+       /**
+        * Wrapper for the RC form with hide/show links
+        * Must be constructed after the model is initialized.
+        *
+        * @extends OO.ui.Widget
+        *
+        * @constructor
+        * @param {mw.rcfilters.dm.FiltersViewModel} filtersModel Changes list view model
+        * @param {mw.rcfilters.dm.ChangesListViewModel} changeListModel Changes list view model
+        * @param {mw.rcfilters.Controller} controller RCfilters controller
+        * @param {jQuery} $formRoot Root element of the form to attach to
+        * @param {Object} config Configuration object
+        */
+       mw.rcfilters.ui.FormWrapperWidget = function MwRcfiltersUiFormWrapperWidget( filtersModel, changeListModel, controller, $formRoot, config ) {
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.FormWrapperWidget.parent.call( this, $.extend( {}, config, {
+                       $element: $formRoot
+               } ) );
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, config );
+
+               this.changeListModel = changeListModel;
+               this.filtersModel = filtersModel;
+               this.controller = controller;
+               this.$submitButton = this.$element.find( 'form input[type=submit]' );
+
+               this.$element
+                       .on( 'click', 'a[data-params]', this.onLinkClick.bind( this ) );
+
+               this.$element
+                       .on( 'submit', 'form', this.onFormSubmit.bind( this ) );
+
+               // Events
+               this.changeListModel.connect( this, {
+                       invalidate: 'onChangesModelInvalidate',
+                       update: 'onChangesModelUpdate'
+               } );
+
+               // Initialize
+               this.cleanUpFieldset();
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-FormWrapperWidget' );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.FormWrapperWidget, OO.ui.Widget );
+       OO.mixinClass( mw.rcfilters.ui.FormWrapperWidget, OO.ui.mixin.PendingElement );
+
+       /**
+        * Respond to link click
+        *
+        * @param {jQuery.Event} e Event
+        * @return {boolean} false
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onLinkClick = function ( e ) {
+               this.controller.updateChangesList( $( e.target ).data( 'params' ) );
+               return false;
+       };
+
+       /**
+        * Respond to form submit event
+        *
+        * @param {jQuery.Event} e Event
+        * @return {boolean} false
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onFormSubmit = function ( e ) {
+               var data = {};
+
+               // Collect all data from form
+               $( e.target ).find( 'input:not([type="hidden"],[type="submit"]), select' ).each( function () {
+                       if ( !$( this ).is( ':checkbox' ) || $( this ).is( ':checked' ) ) {
+                               data[ $( this ).prop( 'name' ) ] = $( this ).val();
+                       }
+               } );
+
+               this.controller.updateChangesList( data );
+               return false;
+       };
+
+       /**
+        * Respond to model invalidate
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onChangesModelInvalidate = function () {
+               this.pushPending();
+               this.$submitButton.prop( 'disabled', true );
+       };
+
+       /**
+        * Respond to model update, replace the show/hide links with the ones from the
+        * server so they feature the correct state.
+        *
+        * @param {jQuery|string} $changesList Updated changes list
+        * @param {jQuery} $fieldset Updated fieldset
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onChangesModelUpdate = function ( $changesList, $fieldset ) {
+               this.$submitButton.prop( 'disabled', false );
+
+               // Replace the entire fieldset
+               this.$element.empty().append( $fieldset.contents() );
+
+               this.cleanUpFieldset();
+
+               this.popPending();
+       };
+
+       /**
+        * Clean up the old-style show/hide that we have implemented in the filter list
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.cleanUpFieldset = function () {
+               var widget = this;
+
+               // 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
+               this.$element.find( '.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 ( widget.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 );
+                       }
+               } );
+       };
+}( 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 a62ef2e..5ded184 100644 (file)
@@ -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,7 +143,7 @@ div.floatleft p {
 
 /* Thumbnails */
 div.thumb {
-       margin-bottom: .5em;
+       margin-bottom: 0.5em;
        width: auto;
        background-color: transparent;
 }
@@ -163,7 +165,7 @@ html .thumbimage {
 }
 
 html .thumbcaption {
-       border: none;
+       border: 0;
        line-height: 1.4em;
        padding: 3px;
        font-size: 94%;
@@ -247,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..cd674ef 100644 (file)
@@ -2,14 +2,14 @@
  * 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
  * compatibility ( browsers able to understand gradient syntax support also SVG ).
  * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
 
-.mw-body a.external,
+.mw-body-content a.external,
 .link-https {
        background: url( images/external-ltr.png ) center right no-repeat;
        /* @embed */
@@ -19,7 +19,7 @@
        padding-right: 15px;
 }
 
-.mw-body a.external[href^="mailto:"],
+.mw-body-content a.external[href^='mailto:'],
 .link-mailto {
        background: url( images/mail.png ) center right no-repeat;
        /* @embed */
@@ -27,7 +27,7 @@
        padding-right: 15px;
 }
 
-.mw-body a.external[href^="ftp://"],
+.mw-body-content a.external[href^='ftp://'],
 .link-ftp {
        background: url( images/ftp-ltr.png ) center right no-repeat;
        /* @embed */
@@ -35,8 +35,8 @@
        padding-right: 15px;
 }
 
-.mw-body a.external[href^="irc://"],
-.mw-body a.external[href^="ircs://"],
+.mw-body-content a.external[href^='irc://'],
+.mw-body-content a.external[href^='ircs://'],
 .link-irc {
        background: url( images/chat-ltr.png ) center right no-repeat;
        /* @embed */
        padding-right: 15px;
 }
 
-.mw-body a.external[href$=".ogg"], .mw-body a.external[href$=".OGG"],
-.mw-body a.external[href$=".mid"], .mw-body a.external[href$=".MID"],
-.mw-body a.external[href$=".midi"], .mw-body a.external[href$=".MIDI"],
-.mw-body a.external[href$=".mp3"], .mw-body a.external[href$=".MP3"],
-.mw-body a.external[href$=".wav"], .mw-body a.external[href$=".WAV"],
-.mw-body a.external[href$=".wma"], .mw-body a.external[href$=".WMA"],
+.mw-body-content a.external[href$='.ogg'],
+.mw-body-content a.external[href$='.OGG'],
+.mw-body-content a.external[href$='.mid'],
+.mw-body-content a.external[href$='.MID'],
+.mw-body-content a.external[href$='.midi'],
+.mw-body-content a.external[href$='.MIDI'],
+.mw-body-content a.external[href$='.mp3'],
+.mw-body-content a.external[href$='.MP3'],
+.mw-body-content a.external[href$='.wav'],
+.mw-body-content a.external[href$='.WAV'],
+.mw-body-content a.external[href$='.wma'],
+.mw-body-content a.external[href$='.WMA'],
 .link-audio {
        background: url( images/audio-ltr.png ) center right no-repeat;
        /* @embed */
        padding-right: 15px;
 }
 
-.mw-body a.external[href$=".ogm"], .mw-body a.external[href$=".OGM"],
-.mw-body a.external[href$=".avi"], .mw-body a.external[href$=".AVI"],
-.mw-body a.external[href$=".mpeg"], .mw-body a.external[href$=".MPEG"],
-.mw-body a.external[href$=".mpg"], .mw-body a.external[href$=".MPG"],
+.mw-body-content a.external[href$='.ogm'],
+.mw-body-content a.external[href$='.OGM'],
+.mw-body-content a.external[href$='.avi'],
+.mw-body-content a.external[href$='.AVI'],
+.mw-body-content a.external[href$='.mpeg'],
+.mw-body-content a.external[href$='.MPEG'],
+.mw-body-content a.external[href$='.mpg'],
+.mw-body-content a.external[href$='.MPG'],
 .link-video {
        background: url( images/video.png ) center right no-repeat;
        /* @embed */
        padding-right: 15px;
 }
 
-.mw-body a.external[href$=".pdf"], .mw-body a.external[href$=".PDF"],
-.mw-body a.external[href*=".pdf#"], .mw-body a.external[href*=".PDF#"],
-.mw-body a.external[href*=".pdf?"], .mw-body a.external[href*=".PDF?"],
+.mw-body-content a.external[href$='.pdf'],
+.mw-body-content a.external[href$='.PDF'],
+.mw-body-content a.external[href*='.pdf#'],
+.mw-body-content a.external[href*='.PDF#'],
+.mw-body-content a.external[href*='.pdf?'],
+.mw-body-content a.external[href*='.PDF?'],
 .link-document {
        background: url( images/document-ltr.png ) center right no-repeat;
        /* @embed */
 }
 
 /* Interwiki styling */
-.mw-body a.extiw,
-.mw-body a.extiw:active {
+.mw-body-content a.extiw,
+.mw-body-content a.extiw:active {
        color: #36b;
 }
 
 /* External link color */
-.mw-body a.external {
+.mw-body-content a.external {
        color: #36b;
 }
index 346771f..b3d1613 100644 (file)
  * automatically when content is modified.
  */
 .mw-body-content {
-       counter-reset: mw-NumberedExtLink;
+       counter-reset: mw-numbered-ext-link;
 }
 
-.mw-body-content a[rel~="mw:ExtLink"]:empty:after {
-       content: "[" counter( mw-NumberedExtLink ) "]";
-       counter-increment: mw-NumberedExtLink;
+.mw-body-content a[rel~='mw:ExtLink']:empty:after {
+       content: '[' counter( mw-numbered-ext-link ) ']';
+       counter-increment: mw-numbered-ext-link;
 }
 
 /**
@@ -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;
@@ -87,8 +88,8 @@ figure[typeof*='mw:Image'] {
                display: table-caption;
                caption-side: bottom;
                /* In mw-core the font-size is duplicated, 94% in thumbiner
-                  and again 94% in thumbcaption. 88% for font size of the
-                  caption results in the same behavior. */
+                * and again 94% in thumbcaption. 88% for font size of the
+                * caption results in the same behavior. */
                font-size: 88%;
                line-height: 1.4em;
                text-align: left;
@@ -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/Frameless'] > figcaption,
+figure[typeof~='mw:Image'] > figcaption {
+       display: none;
+}
index 7d096f9..d204d5d 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,48 +42,50 @@ 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;
 }
 
 /* Interwiki Styling */
-.mw-body a.extiw,
-.mw-body a.extiw:active {
+.mw-body-content a.extiw,
+.mw-body-content a.extiw:active {
        color: #36b;
 }
 
-.mw-body a.extiw:visited {
+.mw-body-content a.extiw:visited {
        color: #636;
 }
 
-.mw-body a.extiw:active {
+.mw-body-content a.extiw:active {
        color: #b63;
 }
 
 /* External links */
-.mw-body a.external {
+.mw-body-content a.external {
        color: #36b;
 }
 
-.mw-body a.external:visited {
-       color: #636; /* bug 3112 */
+.mw-body-content a.external:visited {
+       color: #636; /* T5112 */
 }
 
-.mw-body a.external:active {
+.mw-body-content a.external:active {
        color: #b63;
 }
 
-.mw-body a.external.free {
+.mw-body-content a.external.free {
        word-wrap: break-word;
 }
 
 /* Inline Elements */
 img {
-       border: none;
+       border: 0;
        vertical-align: middle;
 }
 
@@ -91,7 +94,7 @@ hr {
        color: #a2a9b1;
        background-color: #a2a9b1;
        border: 0;
-       margin: .2em 0;
+       margin: 0.2em 0;
 }
 
 /* Structural Elements */
@@ -106,8 +109,8 @@ h6 {
        font-weight: normal;
        margin: 0;
        overflow: hidden;
-       padding-top: .5em;
-       padding-bottom: .17em;
+       padding-top: 0.5em;
+       padding-bottom: 0.17em;
        border-bottom: 1px solid #a2a9b1;
 }
 
@@ -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.
@@ -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 7dbcd4d..2be3bb2 100644 (file)
 
 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 707a579..7f54b90 100644 (file)
@@ -43,7 +43,7 @@
 }
 
 .mw-apisandbox-help-field:last-child {
-       border-bottom: none;
+       border-bottom: 0;
 }
 
 .mw-apisandbox-optionalWidget {
@@ -87,7 +87,7 @@
 }
 
 .mw-apisandbox-textInputCode .oo-ui-inputWidget-input {
-       font-family: monospace, 'Courier';
+       font-family: monospace, monospace;
        font-size: 0.8125em;
        -moz-tab-size: 4;
        -o-tab-size: 4;
index f108e50..97659ed 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 = {},
                                                } );
                                        } 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 );
 
                                widget = new OO.ui.CapsuleMultiselectWidget( {
                                        allowArbitrary: true,
+                                       allowDuplicates: Util.apiBool( pi.allowsduplicates ),
                                        popup: {
                                                classes: [ 'mw-apisandbox-popup' ],
                                                $content: $content
                                .filter( '[href]:not([target])' )
                                .attr( 'target', '_blank' );
                        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 );
+                       }
                }
        };
 
                        }
 
                        $.when.apply( $, deferreds ).done( function () {
-                               var jsonInput;
+                               var formatItems, menu, selectedLabel;
 
                                if ( $.inArray( false, arguments ) !== -1 ) {
                                        windowManager.openWindow( 'errorAlert', {
 
                                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: Util.parseMsg( 'apisandbox-request-url-label' )
-                                                       }
-                                               ).$element,
-                                               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-params-json' )
+                                                       formatDropdown, {
+                                                               label: Util.parseMsg( 'apisandbox-request-selectformat-label' )
                                                        }
                                                ).$element,
+                                               $.map( formatItems, function ( item ) {
+                                                       return item.getData().$element;
+                                               } ),
                                                $result
                                        );
                                ApiSandbox.updateUI();
                                booklet.setPage( '|results|' );
 
-                               // Resize the multiline input once visible
-                               jsonInput.adjustSize();
-
                                location.href = oldhash = '#' + query;
 
                                api.post( params, {
                                                                                booklet.setPage( '|results|' );
                                                                        } ).setDisabled( !paramsAreForced ) ).$element,
                                                                        new OO.ui.PopupButtonWidget( {
+                                                                               $overlay: $( '#mw-apisandbox-ui' ),
                                                                                framed: false,
                                                                                icon: 'info',
                                                                                popup: {
 
                                if ( page.tokenWidget ) {
                                        k = page.apiModule + page.tokenWidget.paramInfo.name;
-                                       tokenWait[ k ] = page.tokenWidget.fetchToken()
+                                       tokenWait[ k ] = page.tokenWidget.fetchToken();
+                                       tokenWait[ k ]
                                                .done( success.bind( page.tokenWidget, k ) )
                                                .fail( failure.bind( page.tokenWidget, k ) );
                                }
 
                Util.fetchModuleInfo( this.apiModule )
                        .done( function ( pi ) {
-                               var prefix, i, j, dl, widget, $widgetLabel, widgetField, helpField, tmp, flag, count,
+                               var prefix, i, j, descriptionContainer, widget, $widgetLabel, widgetField, helpField, tmp, flag, count,
                                        items = [],
                                        deprecatedItems = [],
                                        buttons = [],
 
                                if ( pi.helpurls.length ) {
                                        buttons.push( new OO.ui.PopupButtonWidget( {
+                                               $overlay: $( '#mw-apisandbox-ui' ),
                                                label: mw.message( 'apisandbox-helpurls' ).text(),
                                                icon: 'help',
                                                popup: {
 
                                if ( pi.examples.length ) {
                                        buttons.push( new OO.ui.PopupButtonWidget( {
+                                               $overlay: $( '#mw-apisandbox-ui' ),
                                                label: mw.message( 'apisandbox-examples' ).text(),
                                                icon: 'code',
                                                popup: {
                                                        that.tokenWidget = widget;
                                                }
 
-                                               dl = $( '<dl>' );
-                                               dl.append( $( '<dd>', {
+                                               descriptionContainer = $( '<div>' );
+                                               descriptionContainer.append( $( '<div>', {
                                                        addClass: 'description',
                                                        append: Util.parseHTML( pi.parameters[ i ].description )
                                                } ) );
                                                if ( pi.parameters[ i ].info && pi.parameters[ i ].info.length ) {
                                                        for ( j = 0; j < pi.parameters[ i ].info.length; j++ ) {
-                                                               dl.append( $( '<dd>', {
+                                                               descriptionContainer.append( $( '<div>', {
                                                                        addClass: 'info',
                                                                        append: Util.parseHTML( pi.parameters[ i ].info[ j ] )
                                                                } ) );
 
                                                        case 'limit':
                                                                if ( pi.parameters[ i ].highmax !== undefined ) {
-                                                                       dl.append( $( '<dd>', {
+                                                                       descriptionContainer.append( $( '<div>', {
                                                                                addClass: 'info',
                                                                                append: [
                                                                                        Util.parseMsg(
                                                                                ]
                                                                        } ) );
                                                                } else {
-                                                                       dl.append( $( '<dd>', {
+                                                                       descriptionContainer.append( $( '<div>', {
                                                                                addClass: 'info',
                                                                                append: [
                                                                                        Util.parseMsg( 'api-help-param-limit', pi.parameters[ i ].max ),
                                                                        tmp += 'max';
                                                                }
                                                                if ( tmp !== '' ) {
-                                                                       dl.append( $( '<dd>', {
+                                                                       descriptionContainer.append( $( '<div>', {
                                                                                addClass: 'info',
                                                                                append: Util.parseMsg(
                                                                                        'api-help-param-integer-' + tmp,
                                                                );
                                                        }
                                                        if ( tmp.length ) {
-                                                               dl.append( $( '<dd>', {
+                                                               descriptionContainer.append( $( '<div>', {
                                                                        addClass: 'info',
                                                                        append: Util.parseHTML( tmp.join( ' ' ) )
                                                                } ) );
                                                        } ), {
                                                                align: 'inline',
                                                                classes: [ 'mw-apisandbox-help-field' ],
-                                                               label: dl
+                                                               label: descriptionContainer
                                                        }
                                                );
 
index a30a15d..ae557b4 100644 (file)
@@ -2,7 +2,7 @@
  * Styling for Special:Block
  */
 
-label[for="mw-input-wpConfirm"] {
+label[for='mw-input-wpConfirm'] {
        font-weight: bold;
 }
 
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 163e85d..0fa6610 100644 (file)
@@ -3,7 +3,7 @@
  */
 ( function ( mw, $ ) {
        $( function () {
-               var $preftoc, $preferences, $fieldsets, labelFunc,
+               var $preftoc, $preferences, $fieldsets, labelFunc, previousTab,
                        $tzSelect, $tzTextbox, $localtimeHolder, servertime, allowCloseWindow,
                        convertmessagebox = require( 'mediawiki.notification.convertmessagebox' );
 
                        updateTimezoneSelection();
                }
 
-               // Preserve the tab after saving the preferences
-               // Not using cookies, because their deletion results are inconsistent.
-               // Not using jStorage due to its enormous size (for this feature)
-               if ( window.sessionStorage ) {
-                       if ( sessionStorage.getItem( 'mediawikiPreferencesTab' ) !== null ) {
-                               switchPrefTab( sessionStorage.getItem( 'mediawikiPreferencesTab' ), 'noHash' );
-                       }
+               // Restore the active tab after saving the preferences
+               previousTab = mw.storage.session.get( 'mwpreferences-prevTab' );
+               if ( previousTab ) {
+                       switchPrefTab( previousTab, 'noHash' );
                        // Deleting the key, the tab states should be reset until we press Save
-                       sessionStorage.removeItem( 'mediawikiPreferencesTab' );
-
-                       $( '#mw-prefs-form' ).submit( function () {
-                               var storageData = $( $preftoc ).find( 'li.selected a' ).attr( 'id' ).replace( 'preftab-', '' );
-                               sessionStorage.setItem( 'mediawikiPreferencesTab', storageData );
-                       } );
+                       mw.storage.session.remove( previousTab );
                }
 
+               $( '#mw-prefs-form' ).on( 'submit', function () {
+                       var value = $( $preftoc ).find( 'li.selected a' ).attr( 'id' ).replace( 'preftab-', '' );
+                       mw.storage.session.set( 'mwpreferences-prevTab', value );
+               } );
+
                // Check if all of the form values are unchanged
                function isPrefsChanged() {
                        var inputs = $( '#mw-prefs-form :input[name]' ),
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..5504883
--- /dev/null
@@ -0,0 +1,226 @@
+/* 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 */
+/* stylelint-disable declaration-no-important */
+@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;
+       }
+}
+/* stylelint-enable declaration-no-important */
index ebe9ed9..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;
        float: left;
        width: 100%;
 }
+
+/* Advanced options menu */
+/*==========================*/
+
 #mw-searchoptions {
        margin: 0;
        padding: 0.5em 0.75em 0.75em 0.75em;
        padding-left: 6em;
        font-size: 85%;
 }
+
 #mw-search-interwiki {
        float: right;
        width: 18em;
        border: 1px solid #a2a9b1;
        margin-top: 2ex;
 }
+
 .searchalttitle,
 #mw-search-interwiki li {
        font-size: 95%;
        background-color: #eaecf0;
        border-top: 1px solid #c8ccd1;
 }
+
 .searchdidyoumean {
        font-size: 127%;
        margin-top: 0.8em;
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 d65b284..93ea294 100644 (file)
@@ -1,42 +1,42 @@
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 #mw-editbutton-bold {
-       .background-image("images/@{button-bold}");
+       .background-image('images/@{button-bold}');
 }
 
 #mw-editbutton-italic {
-       .background-image("images/@{button-italic}");
+       .background-image('images/@{button-italic}');
 }
 
 #mw-editbutton-link {
-       .background-image("images/@{button-link}");
+       .background-image('images/@{button-link}');
 }
 
 #mw-editbutton-extlink {
-       .background-image("images/@{button-extlink}");
+       .background-image('images/@{button-extlink}');
 }
 
 #mw-editbutton-headline {
-       .background-image("images/@{button-headline}");
+       .background-image('images/@{button-headline}');
 }
 
 #mw-editbutton-image {
-       .background-image("images/@{button-image}");
+       .background-image('images/@{button-image}');
 }
 
 #mw-editbutton-media {
-       .background-image("images/@{button-media}");
+       .background-image('images/@{button-media}');
 }
 
 #mw-editbutton-nowiki {
-       .background-image("images/@{button-nowiki}");
+       .background-image('images/@{button-nowiki}');
 }
 
 // Who decided to make only this single one different than the name of the data item?
 #mw-editbutton-signature {
-       .background-image("images/@{button-sig}");
+       .background-image('images/@{button-sig}');
 }
 
 #mw-editbutton-hr {
-       .background-image("images/@{button-hr}");
+       .background-image('images/@{button-hr}');
 }
index 4c4e129..8e97c3e 100644 (file)
@@ -1,6 +1,6 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // Helpers
 .mixin-mw-ui-anchor-styles( @mainColor ) {
@@ -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..abe7c46 100644 (file)
@@ -1,6 +1,6 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // Buttons
 //
 //
 // 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.546875em 1em;
+       line-height: 1.286;
        margin: 0;
        border-radius: @borderRadius;
        .box-sizing( border-box );
@@ -43,7 +44,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
        }
 }
 
+input.mw-ui-button,
+button.mw-ui-button {
+       // Buttons in Firefox have extra height
+       &::-moz-focus-inner {
+               margin-top: -1px;
+               margin-bottom: -1px;
+       }
+}
+
 a.mw-ui-button {
        text-decoration: none;
 
@@ -219,12 +229,6 @@ a.mw-ui-button {
        &:focus {
                text-decoration: none;
        }
-
-       // a-tags behave different to inputs if the line-height attribute is inherited
-       // from another element (e.g. mw-body-content). They appear bigger as input
-       // tags. See Bug T116427. To fix that, apply the correct line-height (used
-       // for inputs) to a-tags, too.
-       line-height: normal;
 }
 
 // Button groups
index b0fbf51..2ca20a5 100644 (file)
@@ -1,5 +1,5 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
 
 // Checkbox
 //
        display: table;
 
        * {
-               // reset font sizes (see bug 72727)
+               // reset font sizes (see T74727)
                font: inherit;
                vertical-align: middle;
        }
 
-       input[type="checkbox"] {
+       input[type='checkbox'] {
                // we hide the input element as instead we will style the label that follows
                // we use opacity so that VoiceOver software can still identify it
                opacity: 0;
-               // Render "on top of" the label, so that it's still clickable (T98905)
+               // Render *on top of* the label, so that it's still clickable (T98905)
                z-index: 1;
                position: relative;
                // ensure the invisible checkbox takes up the required width
                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;
@@ -68,7 +68,7 @@
                }
 
                // the pseudo before element of the label after the checkbox now looks like a checkbox
-               & + label::before {
+               & + label:before {
                        content: '';
                        background-color: #fff;
                        .background-image-svg( 'images/checked.svg', 'images/checked.png' );
                }
 
                // when the input is checked, style the label pseudo before element that followed as a checked checkbox
-               &:checked + label::before {
+               &:checked + label:before {
                        .background-size( 100%, 100% );
                }
 
-               &:active + label::before {
+               &:active + label:before {
                        background-color: @colorGray13;
                        border-color: @colorGray13;
                }
 
-               &:focus + label::before {
+               &:focus + label:before {
                        border-width: 2px;
                }
 
-               &:focus:hover + label::before,
-               &:hover + label::before {
+               &:focus:hover + label:before,
+               &:hover + label:before {
                        border-bottom-width: 3px;
                }
 
                // disabled checkboxes have a gray background
-               &:disabled + label::before {
+               &:disabled + label:before {
                        cursor: default;
                        background-color: @colorGray14;
                        border-color: @colorGray14;
                }
 
                // disabled and checked checkboxes have a white circle
-               &:disabled:checked + label::before {
+               &:disabled:checked + label:before {
                        .background-image-svg( 'images/checked_disabled.svg', 'images/checked_disabled.png' );
                }
        }
index 2327efc..d3c76d0 100644 (file)
@@ -1,8 +1,8 @@
 // Form elements and layouts
 
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // --------------------------------------------------------------------------
 // Layouts
@@ -66,7 +66,7 @@
        }
 
        // Override input styling just for checkboxes and radio inputs.
-       input[type="radio"] {
+       input[type='radio'] {
                display: inline;
                .box-sizing( content-box );
                width: auto;
index 0035601..f169d1b 100644 (file)
@@ -1,5 +1,5 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
 
 // Mixins
 .mixin-mw-ui-icon-bgimage( @iconSvg, @iconPng ) {
@@ -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 87ce7be..cc9c65a 100644 (file)
@@ -1,8 +1,8 @@
 // Inputs
 
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // Text inputs
 //
        width: 100%;
        border: 1px solid @colorFieldBorder;
        border-radius: @borderRadius;
-       padding: 0.3em 0.3em 0.3em 0.6em;
+       padding: 0.625em 0.546875em 0.546875em;
        // necessary for smooth transition
        box-shadow: inset 0 0 0 0.1em #fff;
        font-family: inherit;
        font-size: inherit;
-       line-height: inherit;
+       line-height: 1.172em;
        vertical-align: middle;
 
        // Normalize & style placeholder text, see T139034
-       // 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
@@ -97,7 +73,7 @@
        }
 
        // Normalize styling for `<input type="search">`
-       &[type="search"] {
+       &[type='search'] {
                // Correct the odd appearance in Chrome and Safari 5
                -webkit-appearance: textfield;
 
                // 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;
                }
        }
 }
@@ -127,7 +103,7 @@ textarea.mw-ui-input {
 // <button class="mw-ui-button mw-ui-progressive">Submit</button>
 //
 // Styleguide 1.2.
-input[type="number"],
+input[type='number'],
 .mw-ui-input-inline {
        display: inline-block;
        width: auto;
@@ -167,4 +143,5 @@ input.mw-ui-input-large {
        font-size: 1.75em;
        font-weight: bold;
        line-height: 1.25em;
+       padding: 0.3673em 0.3265em 0.3265em;
 }
index 53c22b4..7cb2849 100644 (file)
@@ -1,5 +1,5 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
 
 // Radio
 //
        line-height: @radioSize;
 
        * {
-               // reset font sizes (see bug 72727)
+               // reset font sizes (see T74727)
                font: inherit;
                vertical-align: middle;
        }
 
-       input[type="radio"] {
+       input[type='radio'] {
                // we hide the input element as instead we will style the label that follows
                // we use opacity so that VoiceOver software can still identify it
                opacity: 0;
                // 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;
 
                // the pseudo before element of the label after the radio now looks like a radio
-               & + label::before {
+               & + label:before {
                        content: '';
                        background-color: #fff;
                        .background-image-svg( 'images/radio_checked.svg', 'images/radio_checked.png' );
                }
 
                // when the input is checked, style the label pseudo before element that followed as a checked radio
-               &:checked + label::before {
+               &:checked + label:before {
                        .background-size( 100%, 100% );
                }
 
-               &:active + label::before {
+               &:active + label:before {
                        background-color: @colorGray13;
                        border-color: @colorGray13;
                }
 
-               &:focus + label::before {
+               &:focus + label:before {
                        border-width: 2px;
                }
 
-               &:focus:hover + label::before,
-               &:hover + label::before {
+               &:focus:hover + label:before,
+               &:hover + label:before {
                        border-bottom-width: 3px;
                }
 
                // disabled radios have a gray background
-               &:disabled + label::before {
+               &:disabled + label:before {
                        background-color: @colorGray14;
                        border-color: @colorGray14;
                        cursor: default;
                }
 
                // disabled and checked radios have a white circle
-               &:disabled:checked + label::before {
+               &:disabled:checked + label:before {
                        .background-image-svg( 'images/radio_disabled.svg', 'images/radio_disabled.png' );
                }
        }
index 5551745..a07aa68 100644 (file)
@@ -1,6 +1,6 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 /*
 Text & Anchors
@@ -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 c9d6208..0589d39 100644 (file)
@@ -1,5 +1,5 @@
 /**
  * Provide Agora appearance for mw-ui-* classes.
  */
-@import "components/forms";
-@import "components/utilities";
+@import 'components/forms';
+@import 'components/utilities';
index 77f87f7..093c58b 100644 (file)
@@ -1,10 +1,11 @@
-@import "mediawiki.widgets.datetime.definitions";
+/* 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 84788d2..f205da3 100644 (file)
@@ -1,4 +1,5 @@
-@import "mediawiki.widgets.datetime.definitions";
+/* stylelint-disable no-duplicate-selectors */
+@import 'mediawiki.widgets.datetime.definitions';
 
 .mw-widgets-datetime-dateTimeInputWidget {
        display: inline-block;
@@ -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 bdade36..fa45d5a 100644 (file)
@@ -25,7 +25,7 @@
 }
 
 .oo-ui-transition( @value1, @value2: X, ... ) {
-       @value: ~`"@{arguments}".replace(/[\[\]]|\,\sX/g, '')`; // stylelint-disable-line function-comma-space-after, function-parentheses-space-inside, function-whitespace-after
+       @value: ~`'@{arguments}'.replace(/[\[\]]|\,\sX/g, '')`; // stylelint-disable-line function-comma-space-after, function-parentheses-space-inside, function-whitespace-after, value-keyword-case
        -webkit-transition: @value;
        -moz-transition: @value;
        transition: @value;
index 2fe5d3d..395f80b 100644 (file)
@@ -5,6 +5,7 @@
  * @license The MIT License (MIT); see LICENSE.txt
  */
 
+/* stylelint-disable no-duplicate-selectors */
 @import 'mediawiki.mixins';
 
 @calendarWidth: 21em;
 .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;
        }
 }
@@ -67,8 +68,8 @@
        }
 
        .mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):first-child {
-               margin-top: -@calendarHeight;
-               margin-left: -@calendarWidth;
+               margin-top: -@calendarHeight; /* stylelint-disable-line value-keyword-case */
+               margin-left: -@calendarWidth; /* stylelint-disable-line value-keyword-case */
        }
 
        .mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):last-child {
@@ -82,8 +83,8 @@
        height: @calendarHeight;
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-top: 0 !important;
-               margin-left: 0 !important;
+               margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
+               margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
                .transition( margin-left 500ms );
        }
 }
@@ -93,8 +94,8 @@
        height: @calendarHeight;
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-left: -@calendarWidth !important;
-               margin-top: 0 !important;
+               margin-left: -@calendarWidth !important; /* stylelint-disable-line value-keyword-case, declaration-no-important */
+               margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
                .transition( margin-left 500ms );
        }
 }
        }
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-left: 0 !important;
-               margin-top: 0 !important;
+               margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
+               margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
                .transition( margin-top 500ms );
        }
 }
        }
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-left: 0 !important;
-               margin-top: -@calendarHeight !important;
+               margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
+               margin-top: -@calendarHeight !important; /* stylelint-disable-line value-keyword-case, declaration-no-important */
                .transition( margin-top 500ms );
        }
 }
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 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 3a4581d..9703eea 100644 (file)
                } );
 
                // 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 a174f58..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.
        /**
         * @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;
                }
 
        } );
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 f9cb5de..157ac06 100644 (file)
                                                        if ( self.wasDisabled === undefined ) {
                                                                self.wasDisabled = self.fieldWidget.isDisabled();
                                                        }
-                                                       self.fieldWidget.setDisabled( false );
+                                                       self.fieldWidget.setDisabled( true );
                                                } else if ( self.wasDisabled !== undefined ) {
                                                        self.fieldWidget.setDisabled( self.wasDisabled );
                                                }
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 1b9d2fb..a36b379 100644 (file)
@@ -26,7 +26,7 @@ table.mw-htmlform-nolabel td.mw-label {
 }
 
 tr.mw-htmlform-vertical-label td.mw-label {
-       text-align: left !important;
+       text-align: left !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .mw-icon-question {
@@ -44,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 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 c7ebfd8..172cac2 100644 (file)
 
                return this.upload.getApi().then(
                        function ( api ) {
-                               return $.when(
-                                       booklet.upload.loadConfig().then(
-                                               null,
-                                               function ( errorMsg ) {
-                                                       booklet.getPage( 'upload' ).$element.msg( errorMsg );
-                                                       return $.Deferred().resolve();
-                                               }
-                                       ),
-                                       // If the user can't upload anything, don't give them the option to.
-                                       api.getUserInfo().then( function ( userInfo ) {
+                               // If the user can't upload anything, don't give them the option to.
+                               return api.getUserInfo().then(
+                                       function ( userInfo ) {
                                                if ( userInfo.rights.indexOf( 'upload' ) === -1 ) {
                                                        if ( mw.user.isAnon() ) {
-                                                               booklet.getPage( 'upload' ).$element.msg( 'api-error-mustbeloggedin' );
+                                                               booklet.getPage( 'upload' ).$element.msg( 'apierror-mustbeloggedin', mw.msg( 'action-upload' ) );
                                                        } else {
-                                                               booklet.getPage( 'upload' ).$element.msg( 'api-error-badaccess-groups' );
+                                                               booklet.getPage( 'upload' ).$element.msg( 'apierror-permissiondenied', mw.msg( 'action-upload' ) );
                                                        }
                                                }
                                                return $.Deferred().resolve();
-                                       } )
-                               ).then(
-                                       null,
+                                       },
                                        // Always resolve, never reject
                                        function () { return $.Deferred().resolve(); }
                                );
         * @return {mw.Upload} Upload model
         */
        mw.Upload.BookletLayout.prototype.createUpload = function () {
-               return new mw.Upload();
+               return new mw.Upload( {
+                       parameters: {
+                               errorformat: 'html',
+                               errorlang: mw.config.get( 'wgUserLanguage' ),
+                               errorsuselocal: 1,
+                               formatversion: 2
+                       }
+               } );
        };
 
        /* Uploading */
         * @return {jQuery.Promise} A Promise that will be resolved with an OO.ui.Error.
         */
        mw.Upload.BookletLayout.prototype.getErrorMessageForStateDetails = function () {
-               var message,
-                       state = this.upload.getState(),
+               var state = this.upload.getState(),
                        stateDetails = this.upload.getStateDetails(),
-                       error = stateDetails.error,
-                       warnings = stateDetails.upload && stateDetails.upload.warnings;
+                       error = stateDetails.errors ? stateDetails.errors[ 0 ] : false,
+                       warnings = stateDetails.upload && stateDetails.upload.warnings,
+                       $ul = $( '<ul>' );
 
                if ( state === mw.Upload.State.ERROR ) {
                        if ( !error ) {
                                // If there's an 'exception' key, this might be a timeout, or other connection problem
                                return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-unknownerror', JSON.stringify( stateDetails ) ),
+                                       $( '<p>' ).msg( 'apierror-unknownerror', JSON.stringify( stateDetails ) ),
                                        { recoverable: false }
                                ) );
                        }
 
-                       // Errors in this format are produced by TitleBlacklist and AbuseFilter. Perhaps other
-                       // extensions will follow this format in the future.
-                       if ( error.message ) {
-                               return this.upload.getApi()
-                                       .then( function ( api ) {
-                                               // 'amenableparser' will expand templates and parser functions server-side.
-                                               // We still do the rest of wikitext parsing here (through jqueryMsg).
-                                               return api.loadMessagesIfMissing( [ error.message.key ], { amenableparser: true } )
-                                                       .then( function () {
-                                                               if ( !mw.message( error.message.key ).exists() ) {
-                                                                       return $.Deferred().reject();
-                                                               }
-                                                               return new OO.ui.Error(
-                                                                       $( '<p>' ).msg( error.message.key, error.message.params || [] ),
-                                                                       { recoverable: false }
-                                                               );
-                                                       } );
-                                       } )
-                                       .then( null, function () {
-                                               // We failed when loading the error message, or it doesn't actually exist, fall back
-                                               return $.Deferred().resolve( new OO.ui.Error(
-                                                       $( '<p>' ).msg( 'api-error-unknownerror', JSON.stringify( stateDetails ) ),
-                                                       { recoverable: false }
-                                               ) );
-                                       } );
-                       }
-
-                       if ( error.code === 'protectedpage' ) {
-                               message = mw.message( 'protectedpagetext' );
-                       } else {
-                               message = mw.message( 'api-error-' + error.code );
-                               if ( !message.exists() ) {
-                                       message = mw.message( 'api-error-unknownerror', JSON.stringify( stateDetails ) );
-                               }
-                       }
                        return $.Deferred().resolve( new OO.ui.Error(
-                               $( '<p>' ).append( message.parseDom() ),
+                               $( '<p>' ).html( error.html ),
                                { recoverable: false }
                        ) );
                }
                        // We could get more than one of these errors, these are in order
                        // of importance. For example fixing the thumbnail like file name
                        // won't help the fact that the file already exists.
-                       if ( warnings.stashfailed !== undefined ) {
-                               return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-stashfailed' ),
-                                       { recoverable: false }
-                               ) );
-                       } else if ( warnings.exists !== undefined ) {
+                       if ( warnings.exists !== undefined ) {
                                return $.Deferred().resolve( new OO.ui.Error(
                                        $( '<p>' ).msg( 'fileexists', 'File:' + warnings.exists ),
                                        { recoverable: false }
                                        { recoverable: false }
                                ) );
                        } else if ( warnings.duplicate !== undefined ) {
+                               $.each( warnings.duplicate, function ( i, filename ) {
+                                       var $a = $( '<a>' ).text( filename ),
+                                               href = mw.Title.makeTitle( mw.config.get( 'wgNamespaceIds' ).file, filename ).getUrl( {} );
+
+                                       $a.attr( { href: href, target: '_blank' } );
+                                       $ul.append( $( '<li>' ).append( $a ) );
+                               } );
+
                                return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-duplicate', warnings.duplicate.length ),
+                                       $( '<p>' ).msg( 'file-exists-duplicate', warnings.duplicate.length ).append( $ul ),
                                        { recoverable: false }
                                ) );
                        } else if ( warnings[ 'thumb-name' ] !== undefined ) {
                                ) );
                        } else if ( warnings[ 'duplicate-archive' ] !== undefined ) {
                                return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-duplicate-archive', 1 ),
+                                       $( '<p>' ).msg( 'file-deleted-duplicate', 'File:' + warnings[ 'duplicate-archive' ] ),
                                        { recoverable: false }
                                ) );
                        } else if ( warnings[ 'was-deleted' ] !== undefined ) {
                                return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-was-deleted' ),
+                                       $( '<p>' ).msg( 'filewasdeleted', 'File:' + warnings[ 'was-deleted' ] ),
                                        { recoverable: false }
                                ) );
                        } else if ( warnings.badfilename !== undefined ) {
index 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..f93df3c 100644 (file)
@@ -2,7 +2,7 @@
  * Diff rendering
  */
 table.diff {
-       border: none;
+       border: 0;
        border-spacing: 4px;
        margin: 0;
        width: 100%;
@@ -115,6 +115,6 @@ td.diff-deletedline .diffchange {
 .diff-otitle,
 .diff-ntitle,
 .diff-lineno {
-       direction: ltr !important;
+       direction: ltr !important; /* stylelint-disable-line declaration-no-important */
        unicode-bidi: embed;
 }
index 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 89efae3..2c3e137 100644 (file)
@@ -1,4 +1,4 @@
-@import "mediawiki.ui/variables";
+@import 'mediawiki.ui/variables';
 
 .mediawiki-filewarning {
        visibility: hidden;
index dd6bf74..4eed90a 100644 (file)
@@ -1,4 +1,4 @@
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 #mw-indicator-mw-helplink a {
        .background-image-svg('images/help.svg', 'images/help.png');
index 1662f0f..9c7064f 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 */
 .hlist dt:after {
-       content: ":";
+       content: ':';
 }
 .hlist dd:after,
 .hlist li:after {
-       content: " ·";
+       content: ' ·';
        font-weight: bold;
 }
 .hlist dd:last-child:after,
        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 {
-       content: "(";
+.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 {
-       content: ")";
+.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 {
-       content: ")";
+.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;
 }
 /* Put ordinals in front of ordered list items */
        counter-increment: list-item;
 }
 .hlist ol > li:before {
-       content: counter( list-item ) " ";
+       content: counter( list-item ) ' ';
 }
 .hlist dd ol > li:first-child:before,
 .hlist dt ol > li:first-child:before,
 .hlist li ol > li:first-child:before {
-       content: "(" counter( list-item ) " ";
+       content: '(' counter( list-item ) ' ';
 }
index 49f0f70..c692538 100644 (file)
@@ -1,6 +1,6 @@
 /* General-purpose icons via CSS. Classes here should be named "mw-icon-*". */
 
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 /* For the collapsed and expanded arrows, we also provide selectors to make it
  * easy to use them with jquery.makeCollapsible. */
index fdaa989..5c2f83f 100644 (file)
                 */
                getModuleSize: function ( moduleName ) {
                        var module = mw.loader.moduleRegistry[ moduleName ],
-                               payload = 0;
+                               args, i, size;
 
-                       if ( mw.loader.getState( moduleName ) !== 'ready' ) {
+                       if ( module.state !== 'ready' ) {
                                return null;
                        }
 
                        if ( !module.style && !module.script ) {
-                               return null;
+                               return 0;
                        }
 
-                       // Tally CSS
-                       if ( module.style && $.isArray( module.style.css ) ) {
-                               $.each( module.style.css, function ( i, stylesheet ) {
-                                       payload += $.byteLength( stylesheet );
-                               } );
+                       function getFunctionBody( func ) {
+                               return String( func )
+                                       // To ensure a deterministic result, replace the start of the function
+                                       // declaration with a fixed string. For example, in Chrome 55, it seems
+                                       // V8 seemingly-at-random decides to sometimes put a line break between
+                                       // the opening brace and first statement of the function body. T159751.
+                                       .replace( /^\s*function\s*\([^)]*\)\s*{\s*/, 'function(){' )
+                                       .replace( /\s*}\s*$/, '}' );
+                       }
+
+                       // Based on the load.php response for this module.
+                       // For example: `mw.loader.implement("example", function(){}, {"css":[".x{color:red}"]});`
+                       // @see mw.loader.store.set().
+                       args = [
+                               moduleName,
+                               module.script,
+                               module.style,
+                               module.messages,
+                               module.templates
+                       ];
+                       // Trim trailing null or empty object, as load.php would have done.
+                       // @see ResourceLoader::makeLoaderImplementScript and ResourceLoader::trimArray.
+                       i = args.length;
+                       while ( i-- ) {
+                               if ( args[ i ] === null || ( $.isPlainObject( args[ i ] ) && $.isEmptyObject( args[ i ] ) ) ) {
+                                       args.splice( i, 1 );
+                               } else {
+                                       break;
+                               }
                        }
 
-                       // Tally JavaScript
-                       if ( $.isFunction( module.script ) ) {
-                               payload += $.byteLength( module.script.toString() );
+                       size = 0;
+                       for ( i = 0; i < args.length; i++ ) {
+                               if ( typeof args[ i ] === 'function' ) {
+                                       size += $.byteLength( getFunctionBody( args[ i ] ) );
+                               } else {
+                                       size += $.byteLength( JSON.stringify( args[ i ] ) );
+                               }
                        }
 
-                       return payload;
+                       return size;
                },
 
                /**
index fceeb64..33f146b 100644 (file)
@@ -8,6 +8,7 @@
  * @singleton
  */
 
+/* global mwNow */
 /* eslint-disable no-use-before-define */
 
 ( function ( $ ) {
@@ -51,6 +52,7 @@
                /* eslint-enable no-bitwise */
        }
 
+       // <https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Set>
        StringSet = window.Set || ( function () {
                /**
                 * @private
@@ -63,7 +65,7 @@
                        this.set[ value ] = true;
                };
                StringSet.prototype.has = function ( value ) {
-                       return this.set.hasOwnProperty( value );
+                       return hasOwn.call( this.set, value );
                };
                return StringSet;
        }() );
@@ -81,9 +83,8 @@
         *  copied in one direction only. Changes to globals do not reflect in the map.
         */
        function Map( global ) {
-               this.internalValues = {};
+               this.values = {};
                if ( global === true ) {
-
                        // Override #set to also set the global variable
                        this.set = function ( selection, value ) {
                                var s;
                                return false;
                        };
                }
-
-               // Deprecated since MediaWiki 1.28
-               log.deprecate(
-                       this,
-                       'values',
-                       this.internalValues,
-                       'mw.Map#values is deprecated. Use mw.Map#get() instead.',
-                       'Map-values'
-               );
        }
 
        /**
         * @param {Mixed} value
         */
        function setGlobalMapValue( map, key, value ) {
-               map.internalValues[ key ] = value;
+               map.values[ key ] = value;
                log.deprecate(
                                window,
                                key,
                 *
                 * @param {string|Array} [selection] Key or array of keys to retrieve values for.
                 * @param {Mixed} [fallback=null] Value for keys that don't exist.
-                * @return {Mixed|Object| null} If selection was a string, returns the value,
+                * @return {Mixed|Object|null} If selection was a string, returns the value,
                 *  If selection was an array, returns an object of key/values.
-                *  If no selection is passed, the internal container is returned. (Beware that,
-                *  as is the default in JavaScript, the object is returned by reference.)
+                *  If no selection is passed, a new object with all key/values is returned.
                 */
                get: function ( selection, fallback ) {
                        var results, i;
-                       // If we only do this in the `return` block, it'll fail for the
-                       // call to get() from the mutli-selection block.
                        fallback = arguments.length > 1 ? fallback : null;
 
                        if ( $.isArray( selection ) ) {
-                               selection = slice.call( selection );
                                results = {};
                                for ( i = 0; i < selection.length; i++ ) {
-                                       results[ selection[ i ] ] = this.get( selection[ i ], fallback );
+                                       if ( typeof selection[ i ] === 'string' ) {
+                                               results[ selection[ i ] ] = hasOwn.call( this.values, selection[ i ] ) ?
+                                                       this.values[ selection[ i ] ] :
+                                                       fallback;
+                                       }
                                }
                                return results;
                        }
 
                        if ( typeof selection === 'string' ) {
-                               if ( !hasOwn.call( this.internalValues, selection ) ) {
-                                       return fallback;
-                               }
-                               return this.internalValues[ selection ];
+                               return hasOwn.call( this.values, selection ) ?
+                                       this.values[ selection ] :
+                                       fallback;
                        }
 
                        if ( selection === undefined ) {
-                               return this.internalValues;
+                               results = {};
+                               for ( i in this.values ) {
+                                       results[ i ] = this.values[ i ];
+                               }
+                               return results;
                        }
 
                        // Invalid selection key
-                       return null;
+                       return fallback;
                },
 
                /**
 
                        if ( $.isPlainObject( selection ) ) {
                                for ( s in selection ) {
-                                       this.internalValues[ s ] = selection[ s ];
+                                       this.values[ s ] = selection[ s ];
                                }
                                return true;
                        }
                        if ( typeof selection === 'string' && arguments.length > 1 ) {
-                               this.internalValues[ selection ] = value;
+                               this.values[ selection ] = value;
                                return true;
                        }
                        return false;
                 * @return {boolean} True if the key(s) exist
                 */
                exists: function ( selection ) {
-                       var s;
-
+                       var i;
                        if ( $.isArray( selection ) ) {
-                               for ( s = 0; s < selection.length; s++ ) {
-                                       if ( typeof selection[ s ] !== 'string' || !hasOwn.call( this.internalValues, selection[ s ] ) ) {
+                               for ( i = 0; i < selection.length; i++ ) {
+                                       if ( typeof selection[ i ] !== 'string' || !hasOwn.call( this.values, selection[ i ] ) ) {
                                                return false;
                                        }
                                }
                                return true;
                        }
-                       return typeof selection === 'string' && hasOwn.call( this.internalValues, selection );
+                       return typeof selection === 'string' && hasOwn.call( this.values, selection );
                }
        };
 
                 *
                 * @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 e1287db..4849f5a 100644 (file)
@@ -71,6 +71,7 @@
                $notificationContent.appendTo( $notification );
 
                // Private state parameters, meant for internal use only
+               // autoHideSeconds: String alias for number of seconds for timeout of auto-hiding notifications.
                // isOpen: Set to true after .start() is called to avoid double calls.
                //         Set back to false after .close() to avoid duplicating the close animation.
                // isPaused: false after .resume(), true after .pause(). Avoids duplicating or breaking the hide timeouts.
@@ -79,6 +80,9 @@
                //          to stop replacement of a tagged notification with another notification using the same message.
                // options: The options passed to the notification with a little sanitization. Used by various methods.
                // $notification: jQuery object containing the notification DOM node.
+               this.autoHideSeconds = options.autoHideSeconds &&
+                       notification.autoHideSeconds[ options.autoHideSeconds ] ||
+                       notification.autoHideSeconds.short;
                this.isOpen = false;
                this.isPaused = true;
                this.message = message;
                                // Already finished, so don't try to re-clear it
                                delete notif.timeout;
                                notif.close();
-                       }, notification.autoHideSeconds * 1000 );
+                       }, this.autoHideSeconds * 1000 );
                }
        };
 
                 *   A boolean indicating whether the notifification should automatically
                 *   be hidden after shown. Or if it should persist.
                 *
+                * - autoHideSeconds:
+                *   Key to #autoHideSeconds for number of seconds for timeout of auto-hide
+                *   notifications.
+                *
                 * - tag:
                 *   An optional string. When a notification is tagged only one message
                 *   with that tag will be displayed. Trying to display a new notification
                 */
                defaults: {
                        autoHide: true,
+                       autoHideSeconds: 'short',
                        tag: false,
                        title: undefined,
                        type: false
                },
 
                /**
-                * @property {number}
-                * Number of seconds to wait before auto-hiding notifications.
+                * @private
+                * @property {Object}
                 */
-               autoHideSeconds: 5,
+               autoHideSeconds: {
+                       'short': 5,
+                       'long': 30
+               },
 
                /**
                 * @property {number}
-                * Maximum number of notifications to count down auto-hide timers for.
-                * Only the first #autoHideLimit notifications being displayed will
-                * auto-hide. Any notifications further down in the list will only start
-                * counting down to auto-hide after the first few messages have closed.
+                * Maximum number of simultaneous notifications to start auto-hide timers for.
+                * Only this number of notifications being displayed will be auto-hidden at one time.
+                * Any additional notifications in the list will only start counting their timeout for
+                * auto-hiding after the previous messages have been closed.
                 *
-                * This basically represents the number of notifications the user should
-                * be able to process in #autoHideSeconds time.
+                * This basically represents the minimal number of notifications the user should
+                * be able to process during the {@link #defaults default} #autoHideSeconds time.
                 */
                autoHideLimit: 3
        };
index 822c814..216cd5a 100644 (file)
@@ -3,7 +3,7 @@
  * in MediaWiki (used e.g. on Special:ListFiles).
  */
 
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 .TablePager {
        min-width: 80%;
index d414232..6a6aa15 100644 (file)
         *  immediate execution after this amount of time (in milliseconds) if it didn't run
         *  by that time.
         */
-       mw.requestIdleCallback = mw.requestIdleCallbackInternal;
-       /*
-       // XXX: Polyfill disabled due to https://bugs.chromium.org/p/chromium/issues/detail?id=647870
-       mw.requestIdleCallback = window.requestIdleCallback
+       mw.requestIdleCallback = window.requestIdleCallback ?
                // Bind because it throws TypeError if context is not window
-               ? window.requestIdleCallback.bind( window )
-               : mw.requestIdleCallbackInternal;
-       */
+               window.requestIdleCallback.bind( window ) :
+               mw.requestIdleCallbackInternal;
+       // Note: Polyfill was previously disabled due to
+       // https://bugs.chromium.org/p/chromium/issues/detail?id=647870
+       // See also <http://codepen.io/Krinkle/full/XNGEvv>
 }( mediaWiki ) );
index 20f8efb..95c77f8 100644 (file)
         *
         * @class mw.SafeStorage
         * @private
-        */
-
-       /**
-        * @ignore
         * @param {Object|undefined} store The Storage instance to wrap around
         */
        function SafeStorage( store ) {
        };
 
        /**
-         * Set a value in device storage.
-         *
-         * @param {string} key Key name to store under
-         * @param {string} value Value to be stored
-         * @return {boolean} Whether the save succeeded or not
-         */
+        * Set a value in device storage.
+        *
+        * @param {string} key Key name to store under
+        * @param {string} value Value to be stored
+        * @return {boolean} Whether the save succeeded or not
+        */
        SafeStorage.prototype.set = function ( key, value ) {
                try {
                        this.store.setItem( key, value );
        };
 
        /**
-         * Remove a value from device storage.
-         *
-         * @param {string} key Key of item to remove
-         * @return {boolean} Whether the save succeeded or not
-         */
+        * Remove a value from device storage.
+        *
+        * @param {string} key Key of item to remove
+        * @return {boolean} Whether the save succeeded or not
+        */
        SafeStorage.prototype.remove = function ( key ) {
                try {
                        this.store.removeItem( key );
@@ -75,6 +71,9 @@
        };
 
        /**
+        * A wrapper for the HTML5 `localStorage` interface
+        * that is safe to call on all browsers.
+        *
         * @class
         * @singleton
         * @extends mw.SafeStorage
@@ -82,6 +81,9 @@
        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
index c4c91f9..d1fa84a 100644 (file)
                },
 
                /**
-                * Get an automatically generated random ID (stored in a session cookie)
+                * Get an automatically generated random ID (persisted in sessionStorage)
                 *
-                * This ID is ephemeral for everyone, staying in their browser only until they close
-                * their browser.
+                * This ID is ephemeral for everyone, staying in their browser only until they
+                * close their browsing session.
                 *
                 * @return {string} Random session ID
                 */
                sessionId: function () {
-                       var sessionId = mw.cookie.get( 'mwuser-sessionId' );
-                       if ( sessionId === null ) {
+                       var sessionId = mw.storage.session.get( 'mwuser-sessionId' );
+                       if ( !sessionId ) {
                                sessionId = mw.user.generateRandomSessionId();
-                               mw.cookie.set( 'mwuser-sessionId', sessionId, { expires: null } );
+                               mw.storage.session.set( 'mwuser-sessionId', sessionId );
                        }
                        return sessionId;
                },
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 e651c9c..6e9ff0e 100644 (file)
@@ -89,7 +89,7 @@
 
        /**
         * @property {jQuery} $container If the gallery contained in an element that is
-        *      not the main content element, then it stores that element.
+        *   not the main content element, then it stores that element.
         */
 
        /**
 
        /**
         * @property {number} imageHeight Height of the image based on viewport size
-        *      the URLs in the required size.
+        *   the URLs in the required size.
         */
 
        /* Setup */
                        .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 b7a9132..31def27 100644 (file)
@@ -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 7cfe058..7d35cb7 100644 (file)
                                        updateWatchLink( $link, otherAction );
 
                                        // Update the "Watch this page" checkbox on action=edit when the
-                                       // page is watched or unwatched via the tab (bug 12395).
+                                       // page is watched or unwatched via the tab (T14395).
                                        $( '#wpWatchthis' ).prop( 'checked', watchResponse.watched === true );
                                } )
                                .fail( function () {
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 ) );
diff --git a/resources/src/polyfill-nodeTypes.js b/resources/src/polyfill-nodeTypes.js
deleted file mode 100644 (file)
index c8acc86..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Adds window.Node with node types according to:
- * https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247
- */
-
-window.Node = window.Node || {
-       ELEMENT_NODE: 1,
-       ATTRIBUTE_NODE: 2,
-       TEXT_NODE: 3,
-       CDATA_SECTION_NODE: 4,
-       ENTITY_REFERENCE_NODE: 5,
-       ENTITY_NODE: 6,
-       PROCESSING_INSTRUCTION_NODE: 7,
-       COMMENT_NODE: 8,
-       DOCUMENT_NODE: 9,
-       DOCUMENT_TYPE_NODE: 10,
-       DOCUMENT_FRAGMENT_NODE: 11,
-       NOTATION_NODE: 12
-};
index 20818d2..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' );
 
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..c13279e 100644 (file)
@@ -30,9 +30,17 @@ 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
+    page.feedback_element.click
     expect(page.feedback).to match Regexp.escape(feedback)
   end
 end
@@ -50,7 +58,7 @@ Then(/^Password element should be there$/) do
 end
 
 Then(/^there should be a link to (.+)$/) do |text|
-  expect(on(LoginPage).username_displayed_element.when_present.text).to eq text
+  expect(on(LoginPage).username_displayed_element.text).to eq text
 end
 
 Then(/^Username element should be there$/) do
index 8ffdaf1..b58f7a4 100644 (file)
@@ -1,5 +1,5 @@
 When(/^I click Appearance$/) do
-  visit(PreferencesPage).appearance_link_element.when_present.click
+  visit(PreferencesPage).appearance_link_element.click
 end
 
 When(/^I navigate to Preferences$/) do
index f691ffd..96dc491 100644 (file)
@@ -1,43 +1,43 @@
 When(/^I click Editing$/) do
-  visit(PreferencesPage).editing_link_element.when_present.click
+  visit(PreferencesPage).editing_link_element.click
 end
 
 Then(/^I can select edit area font style$/) do
-  expect(on(PreferencesEditingPage).edit_area_font_style_select_element.when_present).to exist
+  expect(on(PreferencesEditingPage).edit_area_font_style_select_element).to exist
 end
 
 Then(/^I can select live preview$/) do
-  expect(on(PreferencesEditingPage).live_preview_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).live_preview_check_element).to exist
 end
 
 Then(/^I can select section editing by double clicking$/) do
-  expect(on(PreferencesEditingPage).edit_section_double_click_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).edit_section_double_click_check_element).to exist
 end
 
 Then(/^I can select section editing by right clicking$/) do
-  expect(on(PreferencesEditingPage).edit_section_right_click_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).edit_section_right_click_check_element).to exist
 end
 
 Then(/^I can select section editing via edit links$/) do
-  expect(on(PreferencesEditingPage).edit_section_edit_link_element.when_present).to exist
+  expect(on(PreferencesEditingPage).edit_section_edit_link_element).to exist
 end
 
 Then(/^I can select show edit toolbar$/) do
-  expect(on(PreferencesEditingPage).show_edit_toolbar_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).show_edit_toolbar_check_element).to exist
 end
 
 Then(/^I can select show preview before edit box$/) do
-  expect(on(PreferencesEditingPage).preview_on_top_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).preview_on_top_check_element).to exist
 end
 
 Then(/^I can select show preview on first edit$/) do
-  expect(on(PreferencesEditingPage).preview_on_first_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).preview_on_first_check_element).to exist
 end
 
 Then(/^I can select to prompt me when entering a blank edit summary$/) do
-  expect(on(PreferencesEditingPage).forced_edit_summary_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).forced_edit_summary_check_element).to exist
 end
 
 Then(/^I can select to warn me when I leave an edit page with unsaved changes$/) do
-  expect(on(PreferencesEditingPage).unsaved_changes_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).unsaved_changes_check_element).to exist
 end
index 5660d49..6d28ce5 100644 (file)
@@ -1,5 +1,5 @@
 When(/^I click User profile$/) do
-  visit(PreferencesPage).user_profile_link_element.when_present.click
+  visit(PreferencesPage).user_profile_link_element.click
 end
 
 Then(/^I can change my gender$/) do
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..32fc2bb 100644 (file)
@@ -3,26 +3,7 @@ require 'page-object'
 class LoginPage
   include PageObject
 
-  page_url 'Special:UserLogin'
-
   element(:error_message, css: 'div#userloginForm div.error')
-  div(:feedback, class: 'errorbox')
-  button(:login, id: 'wpLoginAttempt')
-  li(:logout, id: 'pt-logout')
-  text_field(:password, id: 'wpPassword1')
-  a(:password_strength, text: 'password strength')
-  a(:phishing, text: 'phishing')
-  text_field(:username, id: 'wpName1')
-  a(:username_displayed, title: /Your user page/)
-
-  def logged_in_as_element
-    @browser.div(id: 'mw-content-text').p.b
-  end
-
-  def login_with(username, password, wait_for_logout_element = true)
-    username_element.when_present.send_keys(username)
-    password_element.when_present.send_keys(password)
-    login_element.when_present.click
-    logout_element.when_present(10) if wait_for_logout_element
-  end
+  element(:password_error, css: 'input#wpPassword1:required:invalid')
+  element(:username_error, css: 'input#wpName1:required:invalid')
 end
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 4fd1cde..6d1fdf5 100644 (file)
@@ -241,4 +241,3 @@ class MWHttpRequestTestCase extends PHPUnit_Framework_TestCase {
                        array_change_key_case( $cookieJar->cookie, CASE_LOWER ) );
        }
 }
-
index 7809ab3..5ce0b34 100644 (file)
@@ -201,4 +201,3 @@ class DbTestPreviewer extends TestRecorder {
                        . " and $postDate";
        }
 }
-
index 0e94301..04a2a8d 100644 (file)
@@ -81,4 +81,3 @@ class DbTestRecorder extends TestRecorder {
                $this->db->commit( __METHOD__ );
        }
 }
-
index 4739be4..73d4a47 100644 (file)
@@ -55,4 +55,3 @@ class DjVuSupport {
                        && is_executable( $wgDjvuTxt );
        }
 }
-
index cad3a53..ac9f150 100644 (file)
@@ -323,4 +323,3 @@ class ParserTestPrinter extends TestRecorder {
                return ( $success == $total );
        }
 }
-
index a15d09e..37ed85f 100644 (file)
@@ -84,4 +84,3 @@ class ParserTestResultNormalizer {
                        [ '<body>' => '', '</body>' => '' ] );
        }
 }
-
index 281e1df..35c2480 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,9 @@ class ParserTestRunner {
                        'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
                        'wgLanguageCode' => $langCode,
                        'wgRawHtml' => self::getOptionValue( 'wgRawHtml', $opts, false ),
-                       'wgNamespacesWithSubpages' => [ 0 => isset( $opts['subpage'] ) ],
+                       'wgNamespacesWithSubpages' => array_fill_keys(
+                               MWNamespace::getValidNamespaces(), isset( $opts['subpage'] )
+                       ),
                        'wgMaxTocLevel' => $maxtoclevel,
                        'wgAllowExternalImages' => self::getOptionValue( 'wgAllowExternalImages', $opts, true ),
                        'wgThumbLimits' => [ self::getOptionValue( 'thumbsize', $opts, 180 ) ],
@@ -1318,7 +1320,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`" );
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 a48087e..50d1bc9 100644 (file)
Binary files a/tests/parser/extraParserTests.txt and b/tests/parser/extraParserTests.txt differ
index 56816e1..be6e3a8 100644 (file)
@@ -609,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
@@ -619,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
@@ -629,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
@@ -933,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
@@ -942,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
@@ -955,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
@@ -965,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
@@ -978,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
@@ -988,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
@@ -1001,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)
@@ -1015,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)
@@ -1046,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
 
@@ -1135,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
@@ -1186,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
@@ -1301,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>
 
@@ -1372,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
@@ -1390,7 +1382,7 @@ parsoid=wt2html
 ###
 
 !! test
-Bare pipe character (bug 52363)
+Bare pipe character (T54363)
 !! wikitext
 |
 !! html
@@ -1399,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
@@ -1496,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
@@ -2170,7 +2164,7 @@ Regression with preformatted in <center>
 !! end
 
 !! test
-Bug 52763: Preformatted in <blockquote>
+T54763: Preformatted in <blockquote>
 !! wikitext
 <blockquote>
  Blah
@@ -2194,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
@@ -2211,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
@@ -2226,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>
@@ -2243,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
@@ -2252,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
@@ -2261,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
@@ -2279,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
@@ -2288,7 +2282,7 @@ Entities inside <pre>
 !! end
 
 !! test
-<nowiki> inside <pre> (bug 13238)
+<nowiki> inside <pre> (T15238)
 !! wikitext
 <pre>
 <nowiki>
@@ -2319,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>
@@ -2349,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
@@ -2373,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
 
@@ -2400,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
@@ -2418,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>
@@ -2427,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>
@@ -2549,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>
@@ -2558,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
@@ -2574,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
@@ -2591,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>
@@ -2609,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
@@ -2790,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 -->
@@ -2820,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
@@ -2861,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
@@ -2908,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
@@ -2921,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
@@ -2932,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
@@ -3049,7 +3046,7 @@ c
 !!end
 
 !!test
-2c. Indent-Pre and tables (bug 42252)
+2c. Indent-Pre and tables (T44252)
 !! wikitext
 {|
  |+ foo
@@ -3120,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>
@@ -3274,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
@@ -3463,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
@@ -3518,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"}}'>
 
 
 
@@ -3569,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 ''
@@ -3691,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>
@@ -3818,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 -->
 ::{|
@@ -4524,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
@@ -4569,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
@@ -4582,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
@@ -4595,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
@@ -4609,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]
@@ -4619,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
@@ -4628,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]
@@ -4656,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
@@ -4678,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
@@ -4798,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
@@ -4818,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
@@ -4963,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
@@ -4975,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.
 ##
 
@@ -5019,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
@@ -5079,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
@@ -5087,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
@@ -5100,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
@@ -5109,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
@@ -5118,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
@@ -5127,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
@@ -5138,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
@@ -5147,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
@@ -5156,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
@@ -5165,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
@@ -5174,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
@@ -5194,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
@@ -5207,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
 
@@ -5228,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]'''
@@ -5246,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
@@ -5259,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
@@ -5270,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
@@ -5282,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
@@ -5293,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
@@ -5304,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
@@ -5316,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
@@ -5327,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
@@ -5336,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
@@ -5347,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]
 
@@ -5362,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]
 
@@ -5377,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
@@ -5386,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
@@ -5460,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
@@ -6346,7 +6390,7 @@ Nested table
 !! end
 
 !! test
-Invalid attributes in table cell (bug 1830)
+Invalid attributes in table cell (T3830)
 !! wikitext
 {|
 |Cell:|broken
@@ -6407,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
@@ -6940,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
@@ -7034,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
@@ -7061,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
@@ -7093,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
@@ -7485,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
@@ -7502,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
@@ -7511,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
@@ -7577,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]]
 
@@ -7656,7 +7646,7 @@ Link with multiple pipes
 !! end
 
 !! test
-Anchor containing a #. (bug 63430)
+Anchor containing a #. (T65430)
 !! wikitext
 [[Main Page#And#Link]]
 !! html/php
@@ -7692,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
@@ -7831,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
@@ -7842,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
@@ -7879,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>]]
@@ -7976,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
@@ -7992,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
@@ -8064,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
@@ -8075,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
@@ -8086,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
@@ -8097,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
@@ -8108,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
@@ -8119,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
@@ -8134,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
@@ -8168,7 +8198,8 @@ parsoid=wt2html
 !! test
 Purely hash wikilink
 !! options
-title=[[User:test/123]]
+title=[[User:Test/123]]
+subpage
 !! wikitext
 [[#a|b]]
 !! html/php
@@ -8180,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
@@ -8255,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
@@ -8266,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
@@ -8291,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
@@ -8328,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
@@ -8341,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]]
@@ -8357,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
@@ -8483,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
@@ -8496,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
@@ -8590,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)
@@ -8622,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
@@ -8639,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]]
@@ -8691,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]]
 
@@ -8768,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
@@ -8779,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
@@ -9026,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
@@ -9410,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>
@@ -9421,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
 
@@ -9619,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)
@@ -9661,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
@@ -9853,7 +9897,7 @@ Magic Word: {{CURRENTHOUR}}
 !! end
 
 !! test
-Magic Word: {{CURRENTWEEK}} (@bug 4594)
+Magic Word: {{CURRENTWEEK}} (T6594)
 !! wikitext
 {{CURRENTWEEK}}
 !! html
@@ -10200,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
@@ -10224,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
@@ -10289,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
@@ -10325,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
@@ -10355,7 +10419,7 @@ Namespace 1 {{ns:01}}
 !! end
 
 !! test
-Namespace 0 {{ns:0}} (bug 4783)
+Namespace 0 {{ns:0}} (T6783)
 !! wikitext
 {{ns:0}}
 !! html
@@ -10363,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
@@ -10507,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
@@ -10518,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
@@ -10529,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
@@ -10540,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
@@ -10557,7 +10621,7 @@ RFC
 !! end
 
 !! test
-Magic links: ISBN (bug 1937)
+Magic links: ISBN (T3937)
 !! wikitext
 ISBN 0-306-40615-2
 !! html/php
@@ -10568,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
@@ -10579,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
@@ -10613,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
@@ -10624,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
@@ -10715,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
@@ -10933,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}}}]]
@@ -11094,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
@@ -11113,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}}
@@ -11133,7 +11197,7 @@ foo
 !! end
 
 !! test
-BUG 41: Template parameters shown as broken links
+T2041: Template parameters shown as broken links
 !! wikitext
 {{{parameter}}}
 !! html
@@ -11381,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
@@ -11392,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
@@ -11405,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==
@@ -11417,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
@@ -12180,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
 
@@ -12496,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
@@ -12510,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
@@ -12601,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
@@ -12619,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
@@ -12635,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
@@ -12684,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
@@ -12693,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
@@ -12723,7 +12787,7 @@ pst
 !!end
 
 !! test
-pre-save transform: <noinclude> in subst (bug 3298)
+pre-save transform: <noinclude> in subst (T5298)
 !! options
 pst
 !! wikitext
@@ -12733,7 +12797,7 @@ Foobar
 !! end
 
 !! test
-pre-save transform: <onlyinclude> in subst (bug 3298)
+pre-save transform: <onlyinclude> in subst (T5298)
 !! options
 pst
 !! wikitext
@@ -12755,7 +12819,7 @@ Template:SafeSubstTest
 !! endarticle
 
 !! test
-bug 22297: safesubst: works during PST
+T24297: safesubst: works during PST
 !! options
 pst
 !! wikitext
@@ -12765,7 +12829,7 @@ FoobarFoobar
 !! end
 
 !! test
-bug 22297: safesubst: works during normal parse
+T24297: safesubst: works during normal parse
 !! wikitext
 {{SafeSubstTest}}
 !! html
@@ -12923,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
@@ -12943,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
@@ -12963,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
@@ -12983,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
@@ -13034,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
@@ -13157,7 +13221,7 @@ msg
 !! end
 
 !! test
-message transform: <noinclude> in transcluded template (bug 4926)
+message transform: <noinclude> in transcluded template (T6926)
 !! options
 msg
 !! wikitext
@@ -13167,7 +13231,7 @@ Foobar
 !! end
 
 !! test
-message transform: <onlyinclude> in transcluded template (bug 4926)
+message transform: <onlyinclude> in transcluded template (T6926)
 !! options
 msg
 !! wikitext
@@ -13289,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
@@ -13300,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
@@ -13311,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
@@ -13322,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
@@ -13484,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
@@ -13519,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
@@ -13541,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
@@ -13556,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
@@ -13648,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
@@ -13700,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
@@ -13742,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
@@ -13755,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
@@ -13768,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
@@ -14006,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
@@ -14091,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
@@ -14102,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
@@ -14113,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
@@ -14123,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
@@ -14136,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
@@ -14147,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
@@ -14158,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
@@ -14212,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
@@ -14232,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
@@ -14296,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
@@ -14345,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
@@ -14375,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
@@ -14719,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
@@ -14744,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]]
@@ -14826,7 +14890,7 @@ Disabled subpages
 !! end
 
 !! test
-BUG 561: {{/Subpage}}
+T2561: {{/Subpage}}
 !! options
 subpage title=[[Page]]
 !! wikitext
@@ -15010,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
@@ -15025,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
@@ -15054,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
@@ -15250,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
@@ -15295,7 +15359,7 @@ es:Alimento fr:Nourriture zh:食品
 !! end
 
 !! test
-Duplicate interlanguage links (bug 24502)
+Duplicate interlanguage links (T26502)
 !! options
 ill
 !! wikitext
@@ -15522,7 +15586,7 @@ __FORCETOC__
 !! end
 
 !! test
-TOC with wgMaxTocLevel=3 (bug 6204)
+TOC with wgMaxTocLevel=3 (T8204)
 !! options
 wgMaxTocLevel=3
 !! wikitext
@@ -15559,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
@@ -15601,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 ==
@@ -15680,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
@@ -15691,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!
@@ -15708,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)
 
@@ -15851,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>
@@ -15908,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
@@ -15919,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
@@ -16047,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>
@@ -16177,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>
@@ -16203,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
@@ -16293,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
@@ -16302,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
@@ -16313,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
@@ -16326,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
@@ -16343,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;]]
@@ -16360,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
@@ -16369,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
@@ -16428,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
@@ -16439,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
@@ -16450,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
@@ -16484,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
@@ -16505,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
@@ -16540,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
@@ -16550,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
@@ -16559,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
@@ -16568,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
@@ -16576,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
@@ -16587,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
@@ -16596,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
@@ -16605,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
@@ -16614,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
@@ -16623,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
@@ -16646,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>
@@ -16744,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>
@@ -16753,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
@@ -16808,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
@@ -16816,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
@@ -16850,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
@@ -17006,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
@@ -17023,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
@@ -17043,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
@@ -17207,7 +17315,7 @@ Sanitizer: Escaping of spaces, multibyte characters, colons & other stuff in id=
 # 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
@@ -17218,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
@@ -17252,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
@@ -17272,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>
@@ -17297,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
@@ -17306,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
@@ -17315,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>
@@ -17336,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
@@ -17356,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>
@@ -17377,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>
@@ -17398,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>
@@ -17433,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
@@ -17470,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>
@@ -17495,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
@@ -17542,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]
 
@@ -17751,7 +17859,7 @@ 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
 {{{
 | 
@@ -17788,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>
@@ -17801,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= ]]
@@ -17813,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>
@@ -17847,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>
@@ -17943,7 +18053,7 @@ Special page transclusion
 !! end
 
 !! test
-Special page transclusion twice (bug 5021)
+Special page transclusion twice (T7021)
 !! options
 !! wikitext
 {{Special:Prefixindex/Xyzzyx}}
@@ -18324,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)
@@ -18348,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)
@@ -18383,7 +18493,7 @@ two
 !! end
 
 
-# Formerly testing for bug 3342
+# Formerly testing for T5342
 !! test
 Section extraction, heading surrounded by <noinclude>
 !! options
@@ -18395,7 +18505,7 @@ section=1
 ==marked==
 !!end
 
-# Test behavior of bug 19910
+# Test behavior of T21910
 !! test
 Sectiion with all-equals
 !! options
@@ -18743,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
@@ -18758,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
@@ -18770,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
@@ -18783,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
@@ -18800,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
@@ -18820,7 +18930,6 @@ stuff
 xxx
 !! end
 
-
 !! test
 Handling of &#x0A; in URLs
 !! wikitext
@@ -18829,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
@@ -18845,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
@@ -19417,12 +19523,33 @@ File:Foobar.jpg|alt=galleryalt|link=http://www.example.org
 !! end
 
 !! test
-Gallery override link with malicious javascript (T36852)
+Gallery override link with absolute external link with LanguageConverter
 !! options
-parsoid={
-  "modes": ["wt2html", "html2html"],
-  "nativeGallery": true
-}
+language=zh
+!! input
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
+</gallery>
+!! result
+<ul class="gallery mw-gallery-traditional">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+<p>caption
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! end
+
+!! test
+Gallery override link with malicious javascript (T36852)
+!! options
+parsoid={
+  "modes": ["wt2html", "html2html"],
+  "nativeGallery": true
+}
 !! wikitext
 <gallery>
 File:Foobar.jpg|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
@@ -19438,7 +19565,7 @@ File:Foobar.jpg|alt=galleryalt|link=" onclick="alert('malicious javascript code!
 
 !! 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="./&quot;_onclick=&quot;alert('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>
+<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
 
@@ -19468,6 +19595,24 @@ File:Foobar.jpg|link=<
 </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
@@ -19484,7 +19629,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-HTML Hex character encoding bogus encoding (bug 26437 regression check)
+HTML Hex character encoding bogus encoding (T28437 regression check)
 !! wikitext
 &#xsee;&#XSEE;
 !! html/php
@@ -19623,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
@@ -19751,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
@@ -19761,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
@@ -20059,7 +20203,7 @@ ISBN 12345678901
 
 
 !! test
-ISBN with trailing year (bug 8110)
+ISBN with trailing year (T9110)
 !! wikitext
 ISBN 1-234-56789-0 - 2006
 
@@ -20108,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;]] }}
@@ -20120,7 +20264,7 @@ __NOEDITSECTION__
 !! end
 
 !! test
-Bug 6200: blockquotes and paragraph formatting
+T8200: blockquotes and paragraph formatting
 !! wikitext
 <blockquote>
 foo
@@ -20141,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
@@ -20303,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
@@ -20313,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
@@ -20472,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
@@ -20586,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.
@@ -20733,19 +20899,61 @@ File:foobar.jpg|{{Test|unamedParam|alt=-{R|param}-}}|alt=galleryalt
 
 !! 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><span class="error">在手动语言转换规则中检测到错误</span></dd></dl>
+<dl><dt>AAA</dt>
+<dt>foo:bar</dt></dl>
 
 !! html/parsoid
-<dl><dt>AAA
-</dt></dl>
+<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>AAA foo:bar bat:baz</dt>
+<dd>def</dd></dl>
+
+!! html/parsoid
+<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
 
 !! test
@@ -20774,7 +20982,7 @@ language=sr variant=sr-ec
 !! end
 
 !! test
-Bug 529: Uncovered bullet
+T2529: Uncovered bullet
 !! wikitext
 * Foo {{bullet}}
 !! html
@@ -20790,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
@@ -20800,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
@@ -20833,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
@@ -20842,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
@@ -20851,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]]
@@ -20996,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
 
@@ -21014,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
@@ -21033,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
 
@@ -21053,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
@@ -21158,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
@@ -21295,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
@@ -21307,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
@@ -21319,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]]
@@ -21395,7 +21603,7 @@ Created page with &quot;&lt;noinclude&gt;<a href="/index.php?title=Category:Requ
 !! end
 
 !! test
-Space normalisation on autocomment (bug 22784)
+Space normalisation on autocomment (T24784)
 !! options
 comment
 title=[[Main Page]]
@@ -21406,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
@@ -21415,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
@@ -21431,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]]
@@ -21447,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
@@ -21462,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]]
@@ -21479,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]]
@@ -21496,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]]
@@ -21513,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]]
@@ -21530,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]]
@@ -21545,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]]
@@ -21562,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]]
@@ -21695,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>
@@ -21742,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]]
@@ -21762,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]]
@@ -21785,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
@@ -21794,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
@@ -21803,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
@@ -21831,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
@@ -21841,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
@@ -21852,7 +22060,7 @@ language=tr
 !! end
 
 !! test
-Bug31490 Turkish: ucfirst 'ix'
+T33490 Turkish: ucfirst 'ix'
 !! options
 language=tr
 !! wikitext
@@ -21863,7 +22071,7 @@ language=tr
 !! end
 
 !! test
-Bug31490 Turkish: lcfirst 'BLAH'
+T33490 Turkish: lcfirst 'BLAH'
 !! options
 language=tr
 !! wikitext
@@ -21874,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
@@ -21885,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
@@ -21896,7 +22104,7 @@ language=en
 !! end
 
 !! test
-Bug 26375: TOC with italics
+T28375: TOC with italics
 !! options
 title=[[Main Page]]
 !! wikitext
@@ -21914,7 +22122,7 @@ __TOC__
 !! end
 
 !! test
-Bug 26375: TOC with bold
+T28375: TOC with bold
 !! options
 title=[[Main Page]]
 !! wikitext
@@ -21932,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
@@ -21950,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
@@ -22105,7 +22313,7 @@ __TOC__
 !! end
 
 !! test
-Bug 72884: bdi element in ToC
+T74884: bdi element in ToC
 !! wikitext
 __TOC__
 == <bdi>test</bdi> ==
@@ -22168,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>
 
@@ -22242,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}}
@@ -22293,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
@@ -22302,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
@@ -22329,101 +22537,6 @@ Ignore pipe between table row attributes
 
 !! 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 absolute external link with LanguageConverter
-!! options
-language=zh
-!! input
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
-</gallery>
-!! result
-<ul class="gallery mw-gallery-traditional">
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
-                       <div class="gallerytext">
-<p>caption
-</p>
-                       </div>
-               </div></li>
-</ul>
-
-!! end
-
-!!test
-Gallery override link with malicious javascript (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
@@ -22458,7 +22571,7 @@ Special:Foobar
 !! end
 
 !!test
-Bug 34939 - Case insensitive link parsing ([HttP://])
+T36939 - Case insensitive link parsing ([HttP://])
 !! wikitext
 [HttP://MediaWiki.Org/]
 !! html/php
@@ -22469,7 +22582,7 @@ Bug 34939 - Case insensitive link parsing ([HttP://])
 !! end
 
 !!test
-Bug 34939 - Case insensitive link parsing ([HttP:// title])
+T36939 - Case insensitive link parsing ([HttP:// title])
 !! wikitext
 [HttP://MediaWiki.Org/ MediaWiki]
 !! html
@@ -22478,7 +22591,7 @@ Bug 34939 - Case insensitive link parsing ([HttP:// title])
 !! end
 
 !!test
-Bug 34939 - Case insensitive link parsing (HttP://)
+T36939 - Case insensitive link parsing (HttP://)
 !! wikitext
 HttP://MediaWiki.Org/
 !! html/php
@@ -22540,7 +22653,7 @@ parsoid=wt2html,wt2wt
 #### Parsoid-specific functionality tests
 #### -----------------------------------------------------------------
 
-# Bug 63642/66749: Formatting elt fixup around images is cleaned up.
+# 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
@@ -22606,573 +22719,6 @@ parsoid=wt2html,wt2wt
 <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="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-2"},"attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-2"><span class="mw-reflink-text">[2]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-y_3-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"y"}}'><a href="./Main_Page#cite_note-y-3"><span class="mw-reflink-text">[3]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-x-2" id="cite_note-x-2"><a href="./Main_Page#cite_ref-x_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-x-2" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-y-3" id="cite_note-y-3"><a href="./Main_Page#cite_ref-y_3-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-y-3" class="mw-reference-text"></span></li>
-</ol>
-!!end
-
-!!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="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-x_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-x_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!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="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-x_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-x_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-x_1-1"><span class="mw-linkback-text">2 </span></a><a href="./Main_Page#cite_ref-x_1-2"><span class="mw-linkback-text">3 </span></a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-# 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="./Main_Page#cite_note-constructor-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-constructor-1" id="cite_note-constructor-1"><a href="./Main_Page#cite_ref-constructor_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-constructor-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!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="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">This is a <b><a rel="mw:WikiLink" href="Bolded_link" title="Bolded link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
-</span></li>
-</ol>
-!!end
-
-!!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="./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="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
- bar
- baz
-</span></li>
-</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="./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="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
-
-bar
-
-
-baz
-
-
-
-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="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C}}</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo {{echo|</span></li>
-</ol>
-!!end
-
-!!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="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <!----></span></li>
-</ol>
-!!end
-
-!!test
-Ref: 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="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C</p>
-
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><b data-parsoid='{"stx":"html","autoInsertedEnd":true}'> foo </b></span></li>
-</ol>
-!!end
-
-!!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="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B
-C <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span> D</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-!!test
-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="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-<span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span></p>
-
-<p>c</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"></span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text"></span></li></ol>
-!!end
-
-!!test
-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="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> A
-<span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span> B</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar
-</span></li>
-</ol>
-!!end
-
-## Roundtripping fails because of nowiki'ing
-!! test
-Ref: 14. A nested ref-tag should be emitted as plain text
-!! options
-parsoid=wt2html
-!! wikitext
-<ref>foo <ref>bar</ref> baz</ref>
-
-<references />
-!! html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span> baz&lt;/ref></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo &lt;ref>bar</span></li></ol>
-!! end
-
-!!test
-Ref: 15. ref-tags with identical names should get identical indexes
-!! 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="./Main_Page#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span> A2 <span about="#mwt4" class="mw-ref" id="cite_ref-a_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="./Main_Page#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span>
-B1 <span about="#mwt7" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"b"}}'><a href="./Main_Page#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span> B2 <span about="#mwt8" class="mw-ref" id="cite_ref-b_2-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="./Main_Page#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-a_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-a_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-b_2-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-b_2-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-## 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="./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="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
-!!end
-
-!!test
-Ref: 17. Generate valid HTML5 id/about attributes
-!!wikitext
-<ref name="a b">foo</ref>
-<ref name=":0">ve-created name</ref>
-
-<references />
-!!html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-a_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_b-1"},"attrs":{"name":"a b"}}'><a href="./Main_Page#cite_note-a_b-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span>
-<span about="#mwt4" class="mw-ref" id="cite_ref-:0_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-:0-2"},"attrs":{"name":":0"}}'><a href="./Main_Page#cite_note-:0-2" style="counter-reset: mw-Ref 2;"><span class="mw-reflink-text">[2]</span></a></span>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a_b-1" id="cite_note-a_b-1"><a href="./Main_Page#cite_ref-a_b_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a_b-1" class="mw-reference-text">foo</span></li><li about="#cite_note-:0-2" id="cite_note-:0-2"><a href="./Main_Page#cite_ref-:0_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-:0-2" class="mw-reference-text">ve-created name</span></li></ol>
-
-!!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="./Main_Page#cite_note-.7B.7Becho.7Ca.7D.7D-1"><span class="mw-reflink-text">[1]</span></a></span>
-</p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-.7B.7Becho.7Ca.7D.7D-1" id="cite_note-.7B.7Becho.7Ca.7D.7D-1"><a href="./Main_Page#cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!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="./Main_Page#cite_note-a_.26_b-1"><span class="mw-reflink-text">[1]</span></a></span> 2 <span about="#mwt4" class="mw-ref" id="cite_ref-a_.26_b_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a &amp;amp; b"}}'><a href="./Main_Page#cite_note-a_.26_b-1"><span class="mw-reflink-text">[1]</span></a></span>
-</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-a_.26_b-1" id="cite_note-a_.26_b-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-a_.26_b_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-a_.26_b_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-a_.26_b-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!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="./Main_Page#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-foo_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"Foo two"},"attrs":{"name":"foo"}}'><a href="./Main_Page#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-foo_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"foo"}}'><a href="./Main_Page#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-foo-1" id="cite_note-foo-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-foo_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-foo_1-1"><span class="mw-linkback-text">2 </span></a><a href="./Main_Page#cite_ref-foo_1-2"><span class="mw-linkback-text">3 </span></a></span> <span id="mw-reference-text-cite_note-foo-1" class="mw-reference-text">Foo one</span></li>
-</ol>
-!!end
-
-!!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="./Main_Page#cite_note-1" data-mw-group="a"><span class="mw-reflink-text">[a 1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"b"}}'><a href="./Main_Page#cite_note-2" data-mw-group="b"><span class="mw-reflink-text">[b 1]</span></a></span>
-C <span class="mw-ref" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="./Main_Page#cite_note-3"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="a" data-mw='{"name":"references","attrs":{"group":"a"}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" data-mw-group="a" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-</ol>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-3" id="cite_note-3"><a href="./Main_Page#cite_ref-3" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">baz</span></li>
-</ol>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt12" data-mw-group="b" data-mw='{"name":"references","attrs":{"group":"b"}}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" data-mw-group="b" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-!!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="./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="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-</ol>
-
-<p>B <span about="#mwt6" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-!!test
-References: 4. only referenced group should be cleared after processing references
-!! 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="./Main_Page#cite_note-1" data-mw-group="a"><span class="mw-reflink-text">[a 1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw-group="a" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" data-mw-group="a" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">afoo</span></li>
-</ol>
-
-<p>C <span about="#mwt8" class="mw-ref" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="./Main_Page#cite_note-3"><span class="mw-reflink-text">[2]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bfoo</span></li><li about="#cite_note-3" id="cite_note-3"><a href="./Main_Page#cite_ref-3" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">cfoo</span></li>
-</ol>
-!!end
-
-## 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
-!! wikitext
-A <ref name="a" />
-B <ref name="b">bar</ref>
-
-<references>
-<ref name="a">foo</ref>
-This should just get lost.
-</references>
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="./Main_Page#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="./Main_Page#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
-
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{},"body":{"html":"\n&lt;span about=\"#mwt8\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[59,82,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-a-1\"},\"attrs\":{\"name\":\"a\"}}&#39;>&lt;a href=\"./Main_Page#cite_note-a-1\" style=\"counter-reset: mw-Ref 1;\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[1]&lt;/span>&lt;/a>&lt;/span>\n"}}'><li about="#cite_note-a-1" id="cite_note-a-1"><a href="./Main_Page#cite_ref-a_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><a href="./Main_Page#cite_ref-b_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
-</ol>
-!! end
-
-!! test
-References: 6. <references /> from a transclusion
-!! wikitext
-<ref>Foo</ref> {{echo|<references />}}
-!! html/parsoid
-<p><span about="#mwt3" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p> <ol class="mw-references" typeof="mw:Extension/references mw:Transclusion" about="#mwt4" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;references />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">Foo</span></li>
-</ol>
-!! end
-
-!! test
-References: 7. Multiple references tags (one without and one with nested refs) should be correctly handled
-!! 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="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}'><a href="./Main_Page#cite_note-b-2" data-mw-group="X"><span class="mw-reflink-text">[X 1]</span></a></span>
-</p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo bar for a</span></li>
-</ol>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="X" data-mw='{"name":"references","attrs":{"group":"X"},"body":{"html":"\n&lt;span about=\"#mwt10\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[96,119,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-b-2\"},\"attrs\":{\"name\":\"b\"}}&#39;>&lt;a href=\"./Main_Page#cite_note-b-2\" style=\"counter-reset: mw-Ref 1;\" data-mw-group=\"X\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[X 1]&lt;/span>&lt;/a>&lt;/span>\n"}}'>
-<li about="#cite_note-b-2" id="cite_note-b-2"><a href="./Main_Page#cite_ref-b_2-0" data-mw-group="X" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">foo</span></li>
-</ol>
-!! end
-
-!! test
-References: 8. T88019: Remove <meta>s from templates inside <ref> that's itself inside a template
-!! 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="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt7" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <b data-parsoid='{"stx":"html"}'>bar</b> and baz boo</span></li>
-</ol>
-!!end
-
-# 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.
-!! test
-References: 9. Generate missing references list at the end
-!! wikitext
-A <ref>foo</ref>
-B <ref group="inexistent">bar</ref>
-!! html/parsoid
-<p>A <span class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B <span class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"inexistent"}}'><a href="./Main_Page#cite_note-2" data-mw-group="inexistent"><span class="mw-reflink-text">[inexistent 1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{},"autoGenerated":true}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-</ol>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw-group="inexistent" data-mw='{"name":"references","attrs":{"group":"inexistent"},"autoGenerated":true}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" data-mw-group="inexistent" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!! end
-
-!! test
-References: 10. New <references/> shouldn't be added for unrelated edits.
-!! options
-parsoid={
-  "modes": ["selser"],
-  "changes": [["#x", "remove"]],
-  "selser": "noauto"
-}
-!! 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
-
-!! test
-Entities in ref name
-!! wikitext
-<ref name="test &amp; me">hi</ref>
-<references />
-!! html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-test_.26_me_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-test_.26_me-1"},"attrs":{"name":"test &amp;amp; me"}}'><a href="./Main_Page#cite_note-test_.26_me-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-test_.26_me-1" id="cite_note-test_.26_me-1"><a href="./Main_Page#cite_ref-test_.26_me_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-test_.26_me-1" class="mw-reference-text">hi</span></li>
-</ol>
-!! end
-
-## 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
-!! 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="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<p>&lt;references></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{},"autoGenerated":true}'><li about="#cite_note-1" id="cite_note-1"><a href="./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
-New reference serializes on its own line
-!! options
-parsoid=wt2wt,html2wt
-!! wikitext
-foo
-<references />
-!! html/parsoid
-foo<ol class="mw-references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'></ol>
-!! end
-
 #### ----------------------------------------------------------------
 #### Parsoid-only testing of Parsoid's impl of LST
 #### Not implemented yet, see
@@ -24278,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
@@ -24313,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
@@ -24364,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
@@ -24378,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
@@ -24398,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
@@ -24412,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
@@ -24432,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
@@ -24447,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
@@ -24893,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
@@ -25580,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
@@ -25676,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
@@ -25828,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"],
@@ -25844,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"],
@@ -25859,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"],
@@ -25875,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"],
@@ -25905,7 +25451,7 @@ parsoid={
 !!end
 
 !! test
-Image: empty alt attribute (bug 48924)
+Image: empty alt attribute (T50924)
 !! options
 parsoid
 !! wikitext
@@ -25915,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
@@ -26520,7 +26066,7 @@ parsoid={
 #------------------------------
 
 !!test
-Bug 54262: New entities
+T56262: New entities
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -26662,7 +26208,7 @@ WTS of autolinks with escapes (editing)
 parsoid={
   "modes": ["wt2wt"],
   "changes": [
-    [ "meta", "remove" ]
+    [ "span", "remove" ]
   ]
 }
 !! wikitext
index 61ad7da..ad06823 100755 (executable)
@@ -7,6 +7,12 @@ if ! which realpath > /dev/null; then
        }
 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
@@ -19,7 +25,7 @@ if [ ! -f "$PHAN" ]; then
                exit 1
        fi
 else
-       export PHAN="php7.0 $PHAN"
+       export PHAN="$PHP $PHAN"
 fi
 
 if [ -z "$MW_INSTALL_PATH" ]; then
index cef03ee..90acc39 100644 (file)
@@ -34,19 +34,27 @@ return [
         * project. directory_list won't find .inc files so
         * we augment it here.
         */
-       'file_list' => [
-               'maintenance/7zip.inc',
-               'maintenance/backupPrefetch.inc',
-               'maintenance/commandLine.inc',
-               'maintenance/sqlite.inc',
-               'maintenance/userOptions.inc',
-               'maintenance/backup.inc',
-               'maintenance/cleanupTable.inc',
-               'maintenance/importImages.inc',
-               'maintenance/userDupes.inc',
-               'maintenance/language/checkLanguage.inc',
-               'maintenance/language/languages.inc',
-       ],
+       '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
@@ -65,7 +73,6 @@ return [
                'resources/',
                'skins/',
                'vendor/',
-               'tests/phan/stubs/',
        ],
 
        /**
@@ -75,10 +82,7 @@ return [
         * This is useful for excluding hopelessly unanalyzable
         * files that can't be removed for whatever reason.
         */
-       'exclude_file_list' => function_exists( 'xcache_get' ) ? [] : [
-               // References xcache which probably isn't installed
-               'includes/libs/objectcache/XCacheBagOStuff.php'
-       ],
+       'exclude_file_list' => [],
 
        /**
         * A list of directories holding code that we want
@@ -96,7 +100,7 @@ return [
                // External class
                'includes/libs/jsminplus.php',
                // separate repositories
-               'skins/'
+               'skins/',
        ],
 
        /**
@@ -129,7 +133,7 @@ return [
         * ```php
         * <?php
         * function test($arg):int {
-        *      return $arg;
+        *    return $arg;
         * }
         * test("abc");
         * ```
@@ -203,7 +207,7 @@ return [
         * with complicated cross-file globals that you have no
         * hope of fixing.
         */
-       'ignore_undeclared_variables_in_global_scope' => false,
+       'ignore_undeclared_variables_in_global_scope' => true,
 
        /**
         * Set to true in order to attempt to detect dead
@@ -339,8 +343,6 @@ return [
                "PhanUndeclaredProperty",
                // approximate error count: 3
                "PhanUndeclaredStaticMethod",
-               // approximate error count: 79
-               "PhanUndeclaredVariable",
        ],
 
        /**
index 8ffcdfb..79feaa0 100644 (file)
@@ -24,4 +24,3 @@
  */
 function register_postsend_function( $callback ) {
 }
-
index e906cdb..7cd9016 100644 (file)
@@ -1,11 +1,11 @@
 <?php
 
-// @codingStandardsIgnoreFile
-
 /**
  * Minimal set of classes necessary for UserMailer to be happy. Types
  * taken from documentation at pear.php.net.
+ * @codingStandardsIgnoreFile
  */
+
 class PEAR {
        /**
         * @param mixed $data
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(){
+}
index fd02a3e..419ff00 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' );
@@ -438,7 +439,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @return string Absolute name of the temporary file
         */
        protected function getNewTempFile() {
-               $fileName = tempnam( wfTempDir(), 'MW_PHPUnit_' . get_class( $this ) . '_' );
+               $fileName = tempnam( wfTempDir(), 'MW_PHPUnit_' . static::class . '_' );
                $this->tmpFiles[] = $fileName;
 
                return $fileName;
@@ -1303,8 +1304,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                if ( isset( $compatibility[$func] ) ) {
                        return call_user_func_array( [ $this, $compatibility[$func] ], $args );
                } else {
-                       throw new MWException( "Called non-existent $func method on "
-                               . get_class( $this ) );
+                       throw new MWException( "Called non-existent $func method on " . static::class );
                }
        }
 
diff --git a/tests/phpunit/autoload.ide.php b/tests/phpunit/autoload.ide.php
new file mode 100644 (file)
index 0000000..106ab68
--- /dev/null
@@ -0,0 +1,112 @@
+<?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/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 12b277e..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
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 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 e2ee193..b7249e5 100644 (file)
@@ -633,35 +633,6 @@ class HtmlTest extends MediaWikiTestCase {
                return $ret;
        }
 
-       /**
-        * @covers Html::expandAttributes
-        */
-       public function testFormValidationBlacklist() {
-               $this->assertEmpty(
-                       Html::expandAttributes( [
-                               'min' => 1,
-                               'max' => 100,
-                               'pattern' => 'abc',
-                               'required' => true,
-                               'step' => 2
-                       ] ),
-                       'Blacklist form validation attributes.'
-               );
-               $this->assertEquals(
-                       ' step="any"',
-                       Html::expandAttributes(
-                               [
-                                       'min' => 1,
-                                       'max' => 100,
-                                       'pattern' => 'abc',
-                                       'required' => true,
-                                       'step' => 'any'
-                               ],
-                               'Allow special case "step=any".'
-                       )
-               );
-       }
-
        public function testWrapperInput() {
                $this->assertEquals(
                        '<input type="radio" value="testval" name="testname"/>',
index 428b012..ed4958f 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\LikeMatch;
+
 /**
  * @group Database
  */
index 092d57b..5977652 100644 (file)
@@ -161,7 +161,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testExists() {
                // Remove the following lines when you implement this test.
                $this->markTestIncomplete(
-                 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                );
        }
        */
@@ -223,7 +223,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testGetCanonicalNamespaces() {
                // Remove the following lines when you implement this test.
                $this->markTestIncomplete(
-                 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                );
        }
        */
@@ -234,7 +234,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
                public function testGetCanonicalName() {
                        // Remove the following lines when you implement this test.
                        $this->markTestIncomplete(
-                         'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                               'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                        );
                }
        */
@@ -245,7 +245,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testGetCanonicalIndex() {
                // Remove the following lines when you implement this test.
                $this->markTestIncomplete(
-                 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                );
        }
        */
@@ -257,7 +257,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testGetValidNamespaces() {
                // Remove the following lines when you implement this test.
                $this->markTestIncomplete(
-                 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                );
        }
        */
index 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 1de9c23..424218e 100644 (file)
@@ -315,14 +315,14 @@ class MessageTest extends MediaWikiLangTestCase {
                return [
                        [ '<span>foo</span>', 'parse', '<span>foo</span>', '<span>foo</span>' ],
                        [ '<span>foo</span>', 'escaped', '&lt;span&gt;foo&lt;/span&gt;',
-                         '<span>foo</span>' ],
+                               '<span>foo</span>' ],
                        [ '<span>foo</span>', 'plain', '<span>foo</span>', '<span>foo</span>' ],
                        [ '<script>alert(1)</script>', 'parse', '&lt;script&gt;alert(1)&lt;/script&gt;',
                                '&lt;script&gt;alert(1)&lt;/script&gt;' ],
                        [ '<script>alert(1)</script>', 'escaped', '&lt;script&gt;alert(1)&lt;/script&gt;',
                                '&lt;script&gt;alert(1)&lt;/script&gt;' ],
                        [ '<script>alert(1)</script>', 'plain', '<script>alert(1)</script>',
-                         '&lt;script&gt;alert(1)&lt;/script&gt;' ],
+                               '&lt;script&gt;alert(1)&lt;/script&gt;' ],
                ];
        }
 
@@ -448,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
index c3faf0d..50f851c 100644 (file)
@@ -12,6 +12,48 @@ 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
@@ -135,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 [
@@ -287,7 +422,7 @@ class OutputPageTest extends MediaWikiTestCase {
        /**
         * @covers OutputPage::haveCacheVaryCookies
         */
-       function testHaveCacheVaryCookies() {
+       public function testHaveCacheVaryCookies() {
                $request = new FauxRequest();
                $context = new RequestContext();
                $context->setRequest( $request );
@@ -309,7 +444,7 @@ class OutputPageTest extends MediaWikiTestCase {
         * @covers OutputPage::addCategoryLinks
         * @covers OutputPage::getCategories
         */
-       function testGetCategories() {
+       public function testGetCategories() {
                $fakeResultWrapper = new FakeResultWrapper( [
                        (object) [
                                'pp_value' => 1,
@@ -335,6 +470,29 @@ class OutputPageTest extends MediaWikiTestCase {
                $this->assertEquals( [ 0 => 'Test2' ], $outputPage->getCategories( 'normal' ) );
                $this->assertEquals( [ 0 => 'Test' ], $outputPage->getCategories( 'hidden' ) );
        }
+
+       /**
+        * @return OutputPage
+        */
+       private function newInstance() {
+               $context = new RequestContext();
+
+               $context->setConfig( new HashConfig( [
+                       'AppleTouchIcon' => false,
+                       'DisableLangConversion' => true,
+                       'EnableAPI' => false,
+                       'EnableCanonicalServerLink' => false,
+                       'Favicon' => false,
+                       'Feed' => false,
+                       'LanguageCode' => false,
+                       'ReferrerPolicy' => false,
+                       'RightsPage' => false,
+                       'RightsUrl' => false,
+                       'UniversalEditButton' => false,
+               ] ) );
+
+               return new OutputPage( $context );
+       }
 }
 
 /**
index 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 c5a7e04..cf2e120 100644 (file)
@@ -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 7086a92..84a6adf 100644 (file)
@@ -38,9 +38,11 @@ class TestLogger extends \Psr\Log\AbstractLogger {
        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, 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, $collectContext = false ) {
                $this->collect = $collect;
@@ -51,9 +53,23 @@ class TestLogger extends \Psr\Log\AbstractLogger {
        /**
         * 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;
        }
 
        /**
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 18ff1f4..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)'
                );
        }
 
index 0ffcbca..e091153 100644 (file)
@@ -204,7 +204,7 @@ class ApiEditPageTest extends ApiTestCase {
        /**
         * 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() {
@@ -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.
                */
index a40db24..eaa4d17 100644 (file)
@@ -439,8 +439,8 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $formatter->addMessagesFromStatus( 'status', $status );
                $this->assertSame( [
                        'error' => [
-                               'code' => 'parentheses',
-                               'info' => $parensPlain,
+                               'code' => 'mainpage',
+                               'info' => $mainpagePlain,
                        ],
                        'warnings' => [
                                'status' => [
@@ -502,6 +502,17 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                        $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' );
        }
 
        /**
index 71dafce..9060dfb 100644 (file)
@@ -451,7 +451,10 @@ class ApiMainTest extends ApiTestCase {
                $context->setRequest( new FauxRequest( [ 'errorformat' => 'plaintext' ] ) );
                $context->setLanguage( 'en' );
                $context->setConfig( new MultiConfig( [
-                       new HashConfig( [ 'ShowHostnames' => true, 'ShowSQLErrors' => false ] ),
+                       new HashConfig( [
+                               'ShowHostnames' => true, 'ShowSQLErrors' => false,
+                               'ShowExceptionDetails' => true, 'ShowDBErrorBacktrace' => true,
+                       ] ),
                        $context->getConfig()
                ] ) );
 
@@ -546,7 +549,9 @@ class ApiMainTest extends ApiTestCase {
                                                [ 'code' => 'existing-error', 'text' => 'existing error', 'module' => 'main' ],
                                                [ 'code' => 'ue', 'text' => "Usage exception!", 'data' => [ 'foo' => 'bar' ] ]
                                        ],
-                                       'docref' => "See $doclink for API usage.",
+                                       '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(),
                                ]
                        ],
@@ -564,7 +569,9 @@ class ApiMainTest extends ApiTestCase {
                                                [ 'code' => 'sv-error1', 'text' => 'An error', 'module' => 'foo+bar' ],
                                                [ 'code' => 'sv-error2', 'text' => 'Another error', 'module' => 'foo+bar' ],
                                        ],
-                                       'docref' => "See $doclink for API usage.",
+                                       '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 5358f29..23fa7bc 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 
-use MediaWiki\MediaWikiServices;
-
 class ApiOpenSearchTest extends MediaWikiTestCase {
        public function testGetAllowedParams() {
                $config = $this->replaceSearchEngineConfig();
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 6b299c9..abef1c9 100644 (file)
@@ -219,7 +219,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
        }
 
        public function testApiTestGroup() {
-               $groups = PHPUnit_Util_Test::getGroups( get_class( $this ) );
+               $groups = PHPUnit_Util_Test::getGroups( static::class );
                $constraint = PHPUnit_Framework_Assert::logicalOr(
                        $this->contains( 'medium' ),
                        $this->contains( 'large' )
index 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 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 ed82153..5eed01c 100644 (file)
@@ -75,7 +75,7 @@ class LocalisationCacheTest extends MediaWikiTestCase {
 
        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 (
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 39948ca..a3d1dda 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() {
@@ -449,8 +434,13 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $page = new WikiPage( $title );
 
                $this->setTemporaryHook( 'SearchDataForIndex',
-                       function ( &$fields, ContentHandler $handler, WikiPage $page, ParserOutput $output,
-                                          SearchEngine $engine ) {
+                       function (
+                               &$fields,
+                               ContentHandler $handler,
+                               WikiPage $page,
+                               ParserOutput $output,
+                               SearchEngine $engine
+                       ) {
                                $fields['testDataField'] = 'test content';
                        } );
 
@@ -461,6 +451,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 +466,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 81b75de..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 [
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 573b395..8b285cb 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.
  *
@@ -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' ],
                ];
        }
 
@@ -148,12 +157,12 @@ class LBFactoryTest extends MediaWikiTestCase {
                                ],
                        ],
                        'serverTemplate' => [
-                               'dbname'          => $wgDBname,
-                               'user'            => $wgDBuser,
-                               'password'        => $wgDBpassword,
-                               'type'            => $wgDBtype,
+                               'dbname'      => $wgDBname,
+                               'user'        => $wgDBuser,
+                               'password'    => $wgDBpassword,
+                               'type'        => $wgDBtype,
                                'dbDirectory' => $wgSQLiteDataDir,
-                               'flags'           => DBO_DEFAULT
+                               'flags'       => DBO_DEFAULT
                        ],
                        'hostsByName' => [
                                'test-db1'  => $wgDBserver,
index 4227693..d7ad1d1 100644 (file)
@@ -1,6 +1,40 @@
 <?php
 
 class DeferredUpdatesTest extends MediaWikiTestCase {
+
+       /**
+        * @covers DeferredUpdates::getPendingUpdates
+        */
+       public function testGetPendingUpdates() {
+               # Prevent updates from running
+               $this->setMwGlobals( 'wgCommandLineMode', false );
+
+               $pre = DeferredUpdates::PRESEND;
+               $post = DeferredUpdates::POSTSEND;
+               $all = DeferredUpdates::ALL;
+
+               $update = $this->getMockBuilder( 'DeferrableUpdate' )
+                             ->getMock();
+               $update->expects( $this->never() )
+                       ->method( 'doUpdate' );
+
+               DeferredUpdates::addUpdate( $update, $pre );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $pre ) );
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates( $post ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $all ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates() );
+               DeferredUpdates::clearPendingUpdates();
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates() );
+
+               DeferredUpdates::addUpdate( $update, $post );
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates( $pre ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $post ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $all ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates() );
+               DeferredUpdates::clearPendingUpdates();
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates() );
+       }
+
        public function testDoUpdatesWeb() {
                $this->setMwGlobals( 'wgCommandLineMode', false );
 
index 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 c3d31d1..f777206 100644 (file)
@@ -4,6 +4,44 @@
  * @group FileRepo
  * @group FileBackend
  * @group medium
+ *
+ * @covers FileBackend
+ *
+ * @covers CopyFileOp
+ * @covers CreateFileOp
+ * @covers DeleteFileOp
+ * @covers DescribeFileOp
+ * @covers FSFile
+ * @covers FSFileBackend
+ * @covers FSFileBackendDirList
+ * @covers FSFileBackendFileList
+ * @covers FSFileBackendList
+ * @covers FSFileOpHandle
+ * @covers FileBackendDBRepoWrapper
+ * @covers FileBackendError
+ * @covers FileBackendGroup
+ * @covers FileBackendMultiWrite
+ * @covers FileBackendStore
+ * @covers FileBackendStoreOpHandle
+ * @covers FileBackendStoreShardDirIterator
+ * @covers FileBackendStoreShardFileIterator
+ * @covers FileBackendStoreShardListIterator
+ * @covers FileJournal
+ * @covers FileOp
+ * @covers FileOpBatch
+ * @covers HTTPFileStreamer
+ * @covers LockManagerGroup
+ * @covers MemoryFileBackend
+ * @covers MoveFileOp
+ * @covers MySqlLockManager
+ * @covers NullFileJournal
+ * @covers NullFileOp
+ * @covers StoreFileOp
+ * @covers TempFSFile
+ *
+ * @covers FSLockManager
+ * @covers LockManager
+ * @covers NullLockManager
  */
 class FileBackendTest extends MediaWikiTestCase {
 
@@ -89,7 +127,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testIsStoragePath
-        * @covers FileBackend::isStoragePath
         */
        public function testIsStoragePath( $path, $isStorePath ) {
                $this->assertEquals( $isStorePath, FileBackend::isStoragePath( $path ),
@@ -114,7 +151,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testSplitStoragePath
-        * @covers FileBackend::splitStoragePath
         */
        public function testSplitStoragePath( $path, $res ) {
                $this->assertEquals( $res, FileBackend::splitStoragePath( $path ),
@@ -139,7 +175,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_normalizeStoragePath
-        * @covers FileBackend::normalizeStoragePath
         */
        public function testNormalizeStoragePath( $path, $res ) {
                $this->assertEquals( $res, FileBackend::normalizeStoragePath( $path ),
@@ -169,7 +204,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testParentStoragePath
-        * @covers FileBackend::parentStoragePath
         */
        public function testParentStoragePath( $path, $res ) {
                $this->assertEquals( $res, FileBackend::parentStoragePath( $path ),
@@ -191,7 +225,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testExtensionFromPath
-        * @covers FileBackend::extensionFromPath
         */
        public function testExtensionFromPath( $path, $res ) {
                $this->assertEquals( $res, FileBackend::extensionFromPath( $path ),
@@ -224,9 +257,6 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       /**
-        * @covers FileBackend::doOperation
-        */
        private function doTestStore( $op ) {
                $backendName = $this->backendClass();
 
@@ -286,7 +316,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testCopy
-        * @covers FileBackend::doOperation
         */
        public function testCopy( $op ) {
                $this->backend = $this->singleBackend;
@@ -407,7 +436,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testMove
-        * @covers FileBackend::doOperation
         */
        public function testMove( $op ) {
                $this->backend = $this->singleBackend;
@@ -529,7 +557,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testDelete
-        * @covers FileBackend::doOperation
         */
        public function testDelete( $op, $withSource, $okStatus ) {
                $this->backend = $this->singleBackend;
@@ -621,7 +648,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testDescribe
-        * @covers FileBackend::doOperation
         */
        public function testDescribe( $op, $withSource, $okStatus ) {
                $this->backend = $this->singleBackend;
@@ -722,7 +748,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testCreate
-        * @covers FileBackend::doOperation
         */
        public function testCreate( $op, $alreadyExists, $okStatus, $newSize ) {
                $this->backend = $this->singleBackend;
@@ -843,9 +868,6 @@ class FileBackendTest extends MediaWikiTestCase {
                return $cases;
        }
 
-       /**
-        * @covers FileBackend::doQuickOperations
-        */
        public function testDoQuickOperations() {
                $this->backend = $this->singleBackend;
                $this->doTestDoQuickOperations();
@@ -1056,7 +1078,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetFileStat
-        * @covers FileBackend::getFileStat
         */
        public function testGetFileStat( $path, $content, $alreadyExists ) {
                $this->backend = $this->singleBackend;
@@ -1132,7 +1153,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetFileStat
-        * @covers FileBackend::streamFile
         */
        public function testStreamFile( $path, $content, $alreadyExists ) {
                $this->backend = $this->singleBackend;
@@ -1231,8 +1251,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetFileContents
-        * @covers FileBackend::getFileContents
-        * @covers FileBackend::getFileContentsMulti
         */
        public function testGetFileContents( $source, $content ) {
                $this->backend = $this->singleBackend;
@@ -1304,7 +1322,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetLocalCopy
-        * @covers FileBackend::getLocalCopy
         */
        public function testGetLocalCopy( $source, $content ) {
                $this->backend = $this->singleBackend;
@@ -1390,7 +1407,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetLocalReference
-        * @covers FileBackend::getLocalReference
         */
        public function testGetLocalReference( $source, $content ) {
                $this->backend = $this->singleBackend;
@@ -1467,10 +1483,6 @@ class FileBackendTest extends MediaWikiTestCase {
                return $cases;
        }
 
-       /**
-        * @covers FileBackend::getLocalCopy
-        * @covers FileBackend::getLocalReference
-        */
        public function testGetLocalCopyAndReference404() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -1499,7 +1511,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetFileHttpUrl
-        * @covers FileBackend::getFileHttpUrl
         */
        public function testGetFileHttpUrl( $source, $content ) {
                $this->backend = $this->singleBackend;
@@ -1544,8 +1555,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testPrepareAndClean
-        * @covers FileBackend::prepare
-        * @covers FileBackend::clean
         */
        public function testPrepareAndClean( $path, $isOK ) {
                $this->backend = $this->singleBackend;
@@ -1626,9 +1635,6 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       /**
-        * @covers FileBackend::clean
-        */
        private function doTestRecursiveClean() {
                $backendName = $this->backendClass();
 
@@ -1673,9 +1679,6 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       /**
-        * @covers FileBackend::doOperations
-        */
        public function testDoOperations() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -1763,9 +1766,6 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Correct file SHA-1 of $fileC" );
        }
 
-       /**
-        * @covers FileBackend::doOperations
-        */
        public function testDoOperationsPipeline() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -1862,9 +1862,6 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Correct file SHA-1 of $fileC" );
        }
 
-       /**
-        * @covers FileBackend::doOperations
-        */
        public function testDoOperationsFailing() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -1939,9 +1936,6 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Correct file SHA-1 of $fileA" );
        }
 
-       /**
-        * @covers FileBackend::getFileList
-        */
        public function testGetFileList() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -2117,10 +2111,6 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       /**
-        * @covers FileBackend::getTopDirectoryList
-        * @covers FileBackend::getDirectoryList
-        */
        public function testGetDirectoryList() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -2334,10 +2324,6 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertEquals( [], $items, "Directory listing is empty." );
        }
 
-       /**
-        * @covers FileBackend::lockFiles
-        * @covers FileBackend::unlockFiles
-        */
        public function testLockCalls() {
                $this->backend = $this->singleBackend;
                $this->doTestLockCalls();
index 95ffb70..6acc943 100644 (file)
@@ -4,6 +4,11 @@
  * @group FileRepo
  * @group FileBackend
  * @group medium
+ *
+ * @covers SwiftFileBackend
+ * @covers SwiftFileBackendDirList
+ * @covers SwiftFileBackendFileList
+ * @covers SwiftFileBackendList
  */
 class SwiftFileBackendTest extends MediaWikiTestCase {
        /** @var TestingAccessWrapper Proxy to SwiftFileBackend */
@@ -28,8 +33,6 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testSanitizeHdrs
-        * @covers SwiftFileBackend::sanitizeHdrs
-        * @covers SwiftFileBackend::getCustomHeaders
         */
        public function testSanitizeHdrs( $raw, $sanitized ) {
                $hdrs = $this->backend->sanitizeHdrs( [ 'headers' => $raw ] );
@@ -92,7 +95,6 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetMetadataHeaders
-        * @covers SwiftFileBackend::getMetadataHeaders
         */
        public function testGetMetadataHeaders( $raw, $sanitized ) {
                $hdrs = $this->backend->getMetadataHeaders( $raw );
@@ -120,7 +122,6 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetMetadata
-        * @covers SwiftFileBackend::getMetadata
         */
        public function testGetMetadata( $raw, $sanitized ) {
                $hdrs = $this->backend->getMetadata( $raw );
index baf8687..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' );
index 7e98d1c..036baa8 100644 (file)
@@ -50,7 +50,7 @@ class HttpTest extends MediaWikiTestCase {
 
        /**
         * Test Http::isValidURI()
-        * @bug 27854 : Http::isValidURI is too lax
+        * T29854 : Http::isValidURI is too lax
         * @dataProvider provideURI
         * @covers Http::isValidURI
         */
@@ -145,7 +145,7 @@ class HttpTest extends MediaWikiTestCase {
         *
         * 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
+        * rewritten when T31232 is taken care of (high-level handling of
         * HTTP redirects).
         */
        public function testRelativeRedirections() {
@@ -483,7 +483,7 @@ class HttpTest extends MediaWikiTestCase {
         * Added this test based on an issue experienced with HHVM 3.3.0-dev
         * where it did not define a cURL constant.
         *
-        * @bug 70570
+        * T72570
         * @dataProvider provideCurlConstants
         */
        public function testCurlConstants( $value ) {
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 );
        }
 
        /**
index 1677851..cd350e5 100644 (file)
@@ -3,7 +3,7 @@
 namespace Wikimedia\Tests\Rdbms;
 
 use IDatabase;
-use LoadBalancer;
+use Wikimedia\Rdbms\LoadBalancer;
 use PHPUnit_Framework_MockObject_MockObject;
 use Wikimedia\Rdbms\ConnectionManager;
 
index 0d54659..3b26d6f 100644 (file)
@@ -3,7 +3,7 @@
 namespace Wikimedia\Tests\Rdbms;
 
 use IDatabase;
-use LoadBalancer;
+use Wikimedia\Rdbms\LoadBalancer;
 use PHPUnit_Framework_MockObject_MockObject;
 use Wikimedia\Rdbms\SessionConsistentConnectionManager;
 
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() {
diff --git a/tests/phpunit/includes/libs/time/ConvertibleTimestampTest.php b/tests/phpunit/includes/libs/time/ConvertibleTimestampTest.php
deleted file mode 100644 (file)
index d48caf3..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-<?php
-
-/**
- * Tests timestamp parsing and output.
- */
-class ConvertibleTimestampTest extends PHPUnit_Framework_TestCase {
-       /**
-        * @covers ConvertibleTimestamp::__construct
-        */
-       public function testConstructWithNoTimestamp() {
-               $timestamp = new ConvertibleTimestamp();
-               $this->assertInternalType( 'string', $timestamp->getTimestamp() );
-               $this->assertNotEmpty( $timestamp->getTimestamp() );
-               $this->assertNotEquals( false, strtotime( $timestamp->getTimestamp( TS_MW ) ) );
-       }
-
-       /**
-        * @covers ConvertibleTimestamp::__toString
-        */
-       public function testToString() {
-               $timestamp = new ConvertibleTimestamp( '1406833268' ); // Equivalent to 20140731190108
-               $this->assertEquals( '1406833268', $timestamp->__toString() );
-       }
-
-       public static function provideValidTimestampDifferences() {
-               return [
-                       [ '1406833268', '1406833269', '00 00 00 01' ],
-                       [ '1406833268', '1406833329', '00 00 01 01' ],
-                       [ '1406833268', '1406836929', '00 01 01 01' ],
-                       [ '1406833268', '1406923329', '01 01 01 01' ],
-               ];
-       }
-
-       /**
-        * @dataProvider provideValidTimestampDifferences
-        * @covers ConvertibleTimestamp::diff
-        */
-       public function testDiff( $timestamp1, $timestamp2, $expected ) {
-               $timestamp1 = new ConvertibleTimestamp( $timestamp1 );
-               $timestamp2 = new ConvertibleTimestamp( $timestamp2 );
-               $diff = $timestamp1->diff( $timestamp2 );
-               $this->assertEquals( $expected, $diff->format( '%D %H %I %S' ) );
-       }
-
-       /**
-        * Test parsing of valid timestamps and outputing to MW format.
-        * @dataProvider provideValidTimestamps
-        * @covers ConvertibleTimestamp::getTimestamp
-        */
-       public function testValidParse( $format, $original, $expected ) {
-               $timestamp = new ConvertibleTimestamp( $original );
-               $this->assertEquals( $expected, $timestamp->getTimestamp( TS_MW ) );
-       }
-
-       /**
-        * Test outputting valid timestamps to different formats.
-        * @dataProvider provideValidTimestamps
-        * @covers ConvertibleTimestamp::getTimestamp
-        */
-       public function testValidOutput( $format, $expected, $original ) {
-               $timestamp = new ConvertibleTimestamp( $original );
-               $this->assertEquals( $expected, (string)$timestamp->getTimestamp( $format ) );
-       }
-
-       /**
-        * Test an invalid timestamp.
-        * @expectedException TimestampException
-        * @covers ConvertibleTimestamp
-        */
-       public function testInvalidParse() {
-               new ConvertibleTimestamp( "This is not a timestamp." );
-       }
-
-       /**
-        * @dataProvider provideValidTimestamps
-        * @covers ConvertibleTimestamp::convert
-        */
-       public function testConvert( $format, $expected, $original ) {
-               $this->assertSame( $expected, ConvertibleTimestamp::convert( $format, $original ) );
-       }
-
-       /**
-        * Format an invalid timestamp.
-        * @covers ConvertibleTimestamp::convert
-        */
-       public function testConvertInvalid() {
-               $this->assertSame( false, ConvertibleTimestamp::convert( 'Not a timestamp', 0 ) );
-       }
-
-       /**
-        * Test an out of range timestamp
-        * @dataProvider provideOutOfRangeTimestamps
-        * @expectedException TimestampException
-        * @covers       ConvertibleTimestamp
-        */
-       public function testOutOfRangeTimestamps( $format, $input ) {
-               $timestamp = new ConvertibleTimestamp( $input );
-               $timestamp->getTimestamp( $format );
-       }
-
-       /**
-        * Test requesting an invalid output format.
-        * @expectedException TimestampException
-        * @covers ConvertibleTimestamp::getTimestamp
-        */
-       public function testInvalidOutput() {
-               $timestamp = new ConvertibleTimestamp( '1343761268' );
-               $timestamp->getTimestamp( 98 );
-       }
-
-       /**
-        * Returns a list of valid timestamps in the format:
-        * [ type, timestamp_of_type, timestamp_in_MW ]
-        */
-       public static function provideValidTimestamps() {
-               return [
-                       // Various formats
-                       [ TS_UNIX, '1343761268', '20120731190108' ],
-                       [ TS_MW, '20120731190108', '20120731190108' ],
-                       [ TS_DB, '2012-07-31 19:01:08', '20120731190108' ],
-                       [ TS_ISO_8601, '2012-07-31T19:01:08Z', '20120731190108' ],
-                       [ TS_ISO_8601_BASIC, '20120731T190108Z', '20120731190108' ],
-                       [ TS_EXIF, '2012:07:31 19:01:08', '20120731190108' ],
-                       [ TS_RFC2822, 'Tue, 31 Jul 2012 19:01:08 GMT', '20120731190108' ],
-                       [ TS_ORACLE, '31-07-2012 19:01:08.000000', '20120731190108' ],
-                       [ TS_POSTGRES, '2012-07-31 19:01:08 GMT', '20120731190108' ],
-                       // Some extremes and weird values
-                       [ TS_ISO_8601, '9999-12-31T23:59:59Z', '99991231235959' ],
-                       [ TS_UNIX, '-62135596801', '00001231235959' ]
-               ];
-       }
-
-       /**
-        * Returns a list of out of range timestamps in the format:
-        * [ type, timestamp_of_type ]
-        */
-       public static function provideOutOfRangeTimestamps() {
-               return [
-                       // Various formats
-                       [ TS_MW, '-62167219201' ], // -0001-12-31T23:59:59Z
-                       [ TS_MW, '253402300800' ], // 10000-01-01T00:00:00Z
-               ];
-       }
-}
index 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 43eb299..196f688 100644 (file)
@@ -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();
                }
 
@@ -33,7 +33,7 @@ abstract class MediaWikiMediaTestCase extends MediaWikiTestCase {
        }
 
        /**
-        * @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 ebeb109..f722fe1 100644 (file)
@@ -27,7 +27,7 @@ class RESTBagOStuffTest extends MediaWikiTestCase {
                $this->client->expects( $this->once() )->method( 'run' )->with( [
                        'method' => 'GET',
                        'url' => 'http://test/rest/42xyz42'
-                   // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
+                       // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
                ] )->willReturn( [ 200, 'OK', [], 's:8:"somedata";', 0 ] );
                $result = $this->bag->get( '42xyz42' );
                $this->assertEquals( 'somedata', $result );
@@ -69,7 +69,7 @@ class RESTBagOStuffTest extends MediaWikiTestCase {
                $this->client->expects( $this->once() )->method( 'run' )->with( [
                        'method' => 'PUT',
                        'url' => 'http://test/rest/42xyz42',
-                   'body' => 's:8:"postdata";'
+                       'body' => 's:8:"postdata";'
                        // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
                ] )->willReturn( [ 200, 'OK', [], 'Done', 0 ] );
                $result = $this->bag->set( '42xyz42', 'postdata' );
index 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 6885ca3..6b911bf 100644 (file)
@@ -155,60 +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( "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' );
-
-               # ------------------------
-               $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->getContent()->getNativeData();
-               $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
         */
@@ -806,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.
@@ -850,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() ],
@@ -882,6 +870,7 @@ more stuff
        public function testDoRollback() {
                $admin = new User();
                $admin->setName( "Admin" );
+               $admin->addToDatabase();
 
                $text = "one";
                $page = $this->newPage( "WikiPageTest_testDoRollback" );
@@ -908,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",
@@ -938,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";
@@ -953,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() );
@@ -966,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",
@@ -983,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",
index fc5d660..eb163d3 100644 (file)
@@ -66,4 +66,3 @@ class ReverseChronologicalPagerTest extends MediaWikiLangTestCase {
                }
        }
 }
-
index 5e00384..ae58d1c 100644 (file)
@@ -2,8 +2,8 @@
 
 /**
  * @group Database
+ * @covers Parser
  */
-
 class ParserMethodsTest extends MediaWikiLangTestCase {
 
        public static function providePreSaveTransform() {
@@ -19,7 +19,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider providePreSaveTransform
-        * @covers Parser::preSaveTransform
         */
        public function testPreSaveTransform( $text, $expected ) {
                global $wgParser;
@@ -63,7 +62,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideStripOuterParagraph
-        * @covers Parser::stripOuterParagraph
         */
        public function testStripOuterParagraph( $text, $expected ) {
                $this->assertEquals( $expected, Parser::stripOuterParagraph( $text ) );
@@ -73,7 +71,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
         * @expectedException MWException
         * @expectedExceptionMessage Parser state cleared while parsing.
         *  Did you call Parser::parse recursively?
-        * @covers Parser::lock
         */
        public function testRecursiveParse() {
                global $wgParser;
@@ -90,9 +87,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                return 'bar';
        }
 
-       /**
-        * @covers Parser::callParserFunction
-        */
        public function testCallParserFunction() {
                global $wgParser;
 
@@ -111,7 +105,7 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * @covers Parser::parse
+        * @covers Parser
         * @covers ParserOutput::getSections
         */
        public function testGetSections() {
@@ -155,8 +149,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideNormalizeLinkUrl
-        * @covers Parser::normalizeLinkUrl
-        * @covers Parser::normalizeUrlComponent
         */
        public function testNormalizeLinkUrl( $explanation, $url, $expected ) {
                $this->assertEquals( $expected, Parser::normalizeLinkUrl( $url ), $explanation );
index d12fee3..7707395 100644 (file)
@@ -2,6 +2,30 @@
 /**
  * Basic tests for Parser::getPreloadText
  * @author Antoine Musso
+ *
+ * @covers Parser
+ * @covers StripState
+ *
+ * @covers Preprocessor_DOM
+ * @covers PPDStack
+ * @covers PPDStackElement
+ * @covers PPDPart
+ * @covers PPFrame_DOM
+ * @covers PPTemplateFrame_DOM
+ * @covers PPCustomFrame_DOM
+ * @covers PPNode_DOM
+ *
+ * @covers Preprocessor_Hash
+ * @covers PPDStack_Hash
+ * @covers PPDStackElement_Hash
+ * @covers PPDPart_Hash
+ * @covers PPFrame_Hash
+ * @covers PPTemplateFrame_Hash
+ * @covers PPCustomFrame_Hash
+ * @covers PPNode_Hash_Tree
+ * @covers PPNode_Hash_Text
+ * @covers PPNode_Hash_Array
+ * @covers PPNode_Hash_Attr
  */
 class ParserPreloadTest extends MediaWikiTestCase {
        /**
@@ -37,32 +61,23 @@ class ParserPreloadTest extends MediaWikiTestCase {
                unset( $this->title );
        }
 
-       /**
-        * @covers Parser::getPreloadText
-        */
        public function testPreloadSimpleText() {
                $this->assertPreloaded( 'simple', 'simple' );
        }
 
-       /**
-        * @covers Parser::getPreloadText
-        */
        public function testPreloadedPreIsUnstripped() {
                $this->assertPreloaded(
                        '<pre>monospaced</pre>',
                        '<pre>monospaced</pre>',
-                       '<pre> in preloaded text must be unstripped (bug 27467)'
+                       '<pre> in preloaded text must be unstripped (T29467)'
                );
        }
 
-       /**
-        * @covers Parser::getPreloadText
-        */
        public function testPreloadedNowikiIsUnstripped() {
                $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 2a4a4ec..12936ee 100644 (file)
@@ -3,6 +3,30 @@
 /**
  * @group Database
  * @group Parser
+ *
+ * @covers Parser
+ * @covers StripState
+ *
+ * @covers Preprocessor_DOM
+ * @covers PPDStack
+ * @covers PPDStackElement
+ * @covers PPDPart
+ * @covers PPFrame_DOM
+ * @covers PPTemplateFrame_DOM
+ * @covers PPCustomFrame_DOM
+ * @covers PPNode_DOM
+ *
+ * @covers Preprocessor_Hash
+ * @covers PPDStack_Hash
+ * @covers PPDStackElement_Hash
+ * @covers PPDPart_Hash
+ * @covers PPFrame_Hash
+ * @covers PPTemplateFrame_Hash
+ * @covers PPCustomFrame_Hash
+ * @covers PPNode_Hash_Tree
+ * @covers PPNode_Hash_Text
+ * @covers PPNode_Hash_Array
+ * @covers PPNode_Hash_Attr
  */
 class TagHookTest extends MediaWikiTestCase {
        public static function provideValidNames() {
@@ -21,7 +45,6 @@ class TagHookTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideValidNames
-        * @covers Parser::setHook
         */
        public function testTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
@@ -41,7 +64,6 @@ class TagHookTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideBadNames
         * @expectedException MWException
-        * @covers Parser::setHook
         */
        public function testBadTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
@@ -58,7 +80,6 @@ class TagHookTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideValidNames
-        * @covers Parser::setFunctionTagHook
         */
        public function testFunctionTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
@@ -78,7 +99,6 @@ class TagHookTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideBadNames
         * @expectedException MWException
-        * @covers Parser::setFunctionTagHook
         */
        public function testBadFunctionTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
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();
+       }
+}
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 cde1e5a..e0a82d0 100644 (file)
@@ -18,6 +18,7 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                        // to avoid notices during testMakeModuleResponse for missing
                        // wgResourceLoaderLESSVars keys in extension hooks.
                        'wgHooks' => [],
+                       'wgShowExceptionDetails' => true,
                ] );
        }
 
index a88264b..6833893 100644 (file)
@@ -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 ec046a7..9c10e49 100644 (file)
@@ -10,7 +10,7 @@ class SearchIndexFieldTest extends MediaWikiTestCase {
                return [
                        [ 0, 'test', 0, 'test', true ],
                        [ SearchIndexField::INDEX_TYPE_NESTED, 'test',
-                         SearchIndexField::INDEX_TYPE_NESTED, 'test', false ],
+                               SearchIndexField::INDEX_TYPE_NESTED, 'test', false ],
                        [ 0, 'test', 0, 'test2', true ],
                        [ 0, 'test', 1, 'test', false ],
                ];
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 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 ab92aee..9b0fb6a 100644 (file)
@@ -101,7 +101,7 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
        }
 
        /**
-        * @bug 2429
+        * T4429
         * @dataProvider provideNamespacesAssociations
         */
        public function testRcNsFilterAssociation( $ns1, $ns2 ) {
@@ -120,7 +120,7 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
        }
 
        /**
-        * @bug 2429
+        * T4429
         * @dataProvider provideNamespacesAssociations
         */
        public function testRcNsFilterAssociationWithInversion( $ns1, $ns2 ) {
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..8a4f662 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,25 @@ 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
+        * @covers MediaWiki\Tidy\Balancer
+        * @covers MediaWiki\Tidy\BalanceSets
+        * @covers MediaWiki\Tidy\BalanceElement
+        * @covers MediaWiki\Tidy\BalanceStack
+        * @covers MediaWiki\Tidy\BalanceMarker
+        * @covers MediaWiki\Tidy\BalanceActiveFormattingElements
         * @dataProvider provideBalancerTests
         */
-       public function testBalancer( $description, $input, $expected ) {
-               $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 +90,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 +150,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;
        }
 }
diff --git a/tests/phpunit/includes/tidy/RemexDriverTest.php b/tests/phpunit/includes/tidy/RemexDriverTest.php
new file mode 100644 (file)
index 0000000..6b16cbf
--- /dev/null
@@ -0,0 +1,297 @@
+<?php
+
+class RemexDriverTest extends MediaWikiTestCase {
+       static private $remexTidyTestData = [
+               // Tests from Html5Depurate
+               [
+                       'Empty string',
+                       "",
+                       ""
+               ],
+               [
+                       'Simple p-wrap',
+                       "x",
+                       "<p>x</p>"
+               ],
+               [
+                       'No p-wrap of blank node',
+                       " ",
+                       " "
+               ],
+               [
+                       'p-wrap terminated by div',
+                       "x<div></div>",
+                       "<p>x</p><div></div>"
+               ],
+               [
+                       'p-wrap not terminated by span',
+                       "x<span></span>",
+                       "<p>x<span></span></p>"
+               ],
+               [
+                       'An element is non-blank and so gets p-wrapped',
+                       "<span></span>",
+                       "<p><span></span></p>"
+               ],
+               [
+                       'The blank flag is set after a block-level element',
+                       "<div></div> ",
+                       "<div></div> "
+               ],
+               [
+                       'Blank detection between two block-level elements',
+                       "<div></div> <div></div>",
+                       "<div></div> <div></div>"
+               ],
+               [
+                       'But p-wrapping of non-blank content works after an element',
+                       "<div></div>x",
+                       "<div></div><p>x</p>"
+               ],
+               [
+                       'p-wrapping between two block-level elements',
+                       "<div></div>x<div></div>",
+                       "<div></div><p>x</p><div></div>"
+               ],
+               [
+                       'p-wrap inside blockquote',
+                       "<blockquote>x</blockquote>",
+                       "<blockquote><p>x</p></blockquote>"
+               ],
+               [
+                       'A comment is blank for p-wrapping purposes',
+                       "<!-- x -->",
+                       "<!-- x -->"
+               ],
+               [
+                       'A comment is blank even when a p-wrap was opened by a text node',
+                       " <!-- x -->",
+                       " <!-- x -->"
+               ],
+               [
+                       'A comment does not open a p-wrap',
+                       "<!-- x -->x",
+                       "<!-- x --><p>x</p>"
+               ],
+               [
+                       'A comment does not close a p-wrap',
+                       "x<!-- x -->",
+                       "<p>x<!-- x --></p>"
+               ],
+               [
+                       'Empty li',
+                       "<ul><li></li></ul>",
+                       "<ul><li class=\"mw-empty-elt\"></li></ul>"
+               ],
+               [
+                       'li with element',
+                       "<ul><li><span></span></li></ul>",
+                       "<ul><li><span></span></li></ul>"
+               ],
+               [
+                       'li with text',
+                       "<ul><li>x</li></ul>",
+                       "<ul><li>x</li></ul>"
+               ],
+               [
+                       'Empty tr',
+                       "<table><tbody><tr></tr></tbody></table>",
+                       "<table><tbody><tr class=\"mw-empty-elt\"></tr></tbody></table>"
+               ],
+               [
+                       'Empty p',
+                       "<p>\n</p>",
+                       "<p class=\"mw-empty-elt\">\n</p>"
+               ],
+               [
+                       'No p-wrapping of an inline element which contains a block element (T150317)',
+                       "<small><div>x</div></small>",
+                       "<small><div>x</div></small>"
+               ],
+               [
+                       'p-wrapping of an inline element which contains an inline element',
+                       "<small><b>x</b></small>",
+                       "<p><small><b>x</b></small></p>"
+               ],
+               [
+                       'p-wrapping is enabled in a blockquote in an inline element',
+                       "<small><blockquote>x</blockquote></small>",
+                       "<small><blockquote><p>x</p></blockquote></small>"
+               ],
+               [
+                       'All bare text should be p-wrapped even when surrounded by block tags',
+                       "<small><blockquote>x</blockquote></small>y<div></div>z",
+                       "<small><blockquote><p>x</p></blockquote></small><p>y</p><div></div><p>z</p>"
+               ],
+               [
+                       'Split tag stack 1',
+                       "<small>x<div>y</div>z</small>",
+                       "<p><small>x</small></p><small><div>y</div></small><p><small>z</small></p>"
+               ],
+               [
+                       'Split tag stack 2',
+                       "<small><div>y</div>z</small>",
+                       "<small><div>y</div></small><p><small>z</small></p>"
+               ],
+               [
+                       'Split tag stack 3',
+                       "<small>x<div>y</div></small>",
+                       "<p><small>x</small></p><small><div>y</div></small>"
+               ],
+               [
+                       'Split tag stack 4 (modified to use splittable tag)',
+                       "a<code>b<i>c<div>d</div></i>e</code>",
+                       "<p>a<code>b<i>c</i></code></p><code><i><div>d</div></i></code><p><code>e</code></p>"
+               ],
+               [
+                       "Split tag stack regression check 1",
+                       "x<span><div>y</div></span>",
+                       "<p>x</p><span><div>y</div></span>"
+               ],
+               [
+                       "Split tag stack regression check 2 (modified to use splittable tag)",
+                       "a<code><i><div>d</div></i>e</code>",
+                       "<p>a</p><code><i><div>d</div></i></code><p><code>e</code></p>"
+               ],
+               // Simple tests from pwrap.js
+               [
+                       'Simple pwrap test 1',
+                       'a',
+                       '<p>a</p>'
+               ],
+               [
+                       '<span> is not a splittable tag, but gets p-wrapped in simple wrapping scenarios',
+                       '<span>a</span>',
+                       '<p><span>a</span></p>'
+               ],
+               [
+                       'Simple pwrap test 3',
+                       'x <div>a</div> <div>b</div> y',
+                       '<p>x </p><div>a</div> <div>b</div><p> y</p>'
+               ],
+               [
+                       'Simple pwrap test 4',
+                       'x<!--c--> <div>a</div> <div>b</div> <!--c-->y',
+                       '<p>x<!--c--> </p><div>a</div> <div>b</div> <!--c--><p>y</p>'
+               ],
+               // Complex tests from pwrap.js
+               [
+                       'Complex pwrap test 1',
+                       '<i>x<div>a</div>y</i>',
+                       '<p><i>x</i></p><i><div>a</div></i><p><i>y</i></p>'
+               ],
+               [
+                       'Complex pwrap test 2',
+                       'a<small>b</small><i>c<div>d</div>e</i>f',
+                       '<p>a<small>b</small><i>c</i></p><i><div>d</div></i><p><i>e</i>f</p>'
+               ],
+               [
+                       'Complex pwrap test 3',
+                       'a<small>b<i>c<div>d</div></i>e</small>',
+                       '<p>a<small>b<i>c</i></small></p><small><i><div>d</div></i></small><p><small>e</small></p>'
+               ],
+               [
+                       'Complex pwrap test 4',
+                       'x<small><div>y</div></small>',
+                       '<p>x</p><small><div>y</div></small>'
+               ],
+               [
+                       'Complex pwrap test 5',
+                       'a<small><i><div>d</div></i>e</small>',
+                       '<p>a</p><small><i><div>d</div></i></small><p><small>e</small></p>'
+               ],
+               [
+                       'Complex pwrap test 6',
+                       '<i>a<div>b</div>c<b>d<div>e</div>f</b>g</i>',
+                       // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong
+                       // PHP 5 does not allow concatenation in initialisation of a class static variable
+                       '<p><i>a</i></p><i><div>b</div></i><p><i>c<b>d</b></i></p><i><b><div>e</div></b></i><p><i><b>f</b>g</i></p>'
+                       // @codingStandardsIgnoreEnd
+               ],
+               /* FIXME the second <b> causes a stack split which clones the <i> even
+                * though no <p> is actually generated
+               [
+                       'Complex pwrap test 7',
+                       '<i><b><font><div>x</div></font></b><div>y</div><b><font><div>z</div></font></b></i>',
+                       '<i><b><font><div>x</div></font></b><div>y</div><b><font><div>z</div></font></b></i>'
+               ],
+                */
+               // New local tests
+               [
+                       'Blank text node after block end',
+                       '<small>x<div>y</div> <b>z</b></small>',
+                       '<p><small>x</small></p><small><div>y</div></small><p><small> <b>z</b></small></p>'
+               ],
+               [
+                       'Text node fostering (FIXME: wrap missing)',
+                       '<table>x</table>',
+                       'x<table></table>'
+               ],
+               [
+                       'Blockquote fostering',
+                       '<table><blockquote>x</blockquote></table>',
+                       '<blockquote><p>x</p></blockquote><table></table>'
+               ],
+               [
+                       'Block element fostering',
+                       '<table><div>x',
+                       '<div>x</div><table></table>'
+               ],
+               [
+                       'Formatting element fostering (FIXME: wrap missing)',
+                       '<table><b>x',
+                       '<b>x</b><table></table>'
+               ],
+               [
+                       'AAA clone of p-wrapped element (FIXME: empty b)',
+                       '<b>x<p>y</b>z</p>',
+                       '<p><b>x</b></p><b></b><p><b>y</b>z</p>',
+               ],
+               [
+                       'AAA with fostering (FIXME: wrap missing)',
+                       '<table><b>1<p>2</b>3</p>',
+                       '<b>1</b><p><b>2</b>3</p><table></table>'
+               ],
+       ];
+
+       public function provider() {
+               return self::$remexTidyTestData;
+       }
+
+       /**
+        * @dataProvider provider
+        * @covers MediaWiki\Tidy\RemexCompatFormatter
+        * @covers MediaWiki\Tidy\RemexCompatMunger
+        * @covers MediaWiki\Tidy\RemexDriver
+        * @covers MediaWiki\Tidy\RemexMungerData
+        */
+       public function testTidy( $desc, $input, $expected ) {
+               $r = new MediaWiki\Tidy\RemexDriver( [] );
+               $result = $r->tidy( $input );
+               $this->assertEquals( $expected, $result, $desc );
+       }
+
+       public function html5libProvider() {
+               $files = json_decode( file_get_contents( __DIR__ . '/html5lib-tests.json' ), true );
+               $tests = [];
+               foreach ( $files as $file => $fileTests ) {
+                       foreach ( $fileTests as $i => $test ) {
+                               $tests[] = [ "$file:$i", $test['data'] ];
+                       }
+               }
+               return $tests;
+       }
+
+       /**
+        * This is a quick and dirty test to make sure none of the html5lib tests
+        * generate exceptions. We don't really know what the expected output is.
+        *
+        * @dataProvider html5libProvider
+        * @coversNothing
+        */
+       public function testHtml5Lib( $desc, $input ) {
+               $r = new MediaWiki\Tidy\RemexDriver( [] );
+               $result = $r->tidy( $input );
+               $this->assertTrue( true, $desc );
+       }
+}
index 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 76cedc6..520108a 100644 (file)
@@ -36,10 +36,18 @@ class NamespaceAwareForeignTitleFactoryTest extends MediaWikiTestCase {
                                'MainNamespaceArticle', null,
                                new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
                        ],
+                       [
+                               'Magic:_The_Gathering', 0,
+                               new ForeignTitle( 0, '', 'Magic:_The_Gathering' ),
+                       ],
                        [
                                'Talk:Nice_talk', 1,
                                new ForeignTitle( 1, 'Talk', 'Nice_talk' ),
                        ],
+                       [
+                               'Talk:Magic:_The_Gathering', 1,
+                               new ForeignTitle( 1, 'Talk', 'Magic:_The_Gathering' ),
+                       ],
                        [
                                'Bogus:Nice_talk', 0,
                                new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
@@ -56,6 +64,11 @@ class NamespaceAwareForeignTitleFactoryTest extends MediaWikiTestCase {
                                'Bogus:Nice_talk', 1,
                                new ForeignTitle( 1, 'Talk', 'Nice_talk' ),
                        ],
+                       // Misconfigured wiki with unregistered namespace (T114115)
+                       [
+                               'Nice_talk', 1234,
+                               new ForeignTitle( 1234, 'Ns1234', 'Nice_talk' ),
+                       ],
                ];
        }
 
index 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 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() );
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 5d9cda7..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,6 +599,7 @@ class UserTest extends MediaWikiTestCase {
                $this->setMwGlobals( [
                        'wgCookieSetOnAutoblock' => true,
                        'wgCookiePrefix' => 'wmsitetitle',
+                       'wgSecretKey' => MWCryptRand::generateHex( 64, true ),
                ] );
 
                // 1. Log in a test user, and block them.
@@ -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( $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.
@@ -703,6 +708,7 @@ class UserTest extends MediaWikiTestCase {
                $this->setMwGlobals( [
                        'wgCookieSetOnAutoblock' => true,
                        'wgCookiePrefix' => 'wm_infinite_block',
+                       'wgSecretKey' => MWCryptRand::generateHex( 64, true ),
                ] );
                // 1. Log in a test user, and block them indefinitely.
                $user1Tmp = $this->getTestUser()->getUser();
@@ -726,13 +732,11 @@ class UserTest extends MediaWikiTestCase {
                $this->assertArrayHasKey( 'wm_infinite_blockBlockID', $cookies );
                $expOneDay = wfTimestamp() + ( 24 * 60 * 60 );
                // Check for expiry dates in a 10-second window, to account for slow testing.
-               $this->assertGreaterThan(
-                       $expOneDay - 5,
-                       $cookies['wm_infinite_blockBlockID']['expire']
-               );
-               $this->assertLessThan(
-                       $expOneDay + 5,
-                       $cookies['wm_infinite_blockBlockID']['expire']
+               $this->assertEquals(
+                       $expOneDay,
+                       $cookies['wm_infinite_blockBlockID']['expire'],
+                       'Expiry date',
+                       5.0
                );
 
                // 3. Change the block's expiry (to 2 hours), and the cookie's should be changed also.
@@ -752,4 +756,181 @@ class UserTest extends MediaWikiTestCase {
                // 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() );
+       }
 }
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 60d4e99..8b54b72 100644 (file)
@@ -45,7 +45,7 @@ class UIDGeneratorTest extends PHPUnit_Framework_TestCase {
                                $last_timestamp_bin,
                                $timestamp_bin,
                                "timestamp ($timestamp_bin) of current ID ($id_bin) >= timestamp ($last_timestamp_bin) " .
-                                 "of prior one ($lastId_bin)" );
+                                       "of prior one ($lastId_bin)" );
 
                        $hostbits_bin = substr( $id_bin, -$hostbits );
                        $last_hostbits_bin = substr( $lastId_bin, -$hostbits );
@@ -55,7 +55,7 @@ class UIDGeneratorTest extends PHPUnit_Framework_TestCase {
                                        $hostbits_bin,
                                        $last_hostbits_bin,
                                        "Host ID ($hostbits_bin) of current ID ($id_bin) is same as host ID ($last_hostbits_bin) " .
-                                         "of prior one ($lastId_bin)." );
+                                               "of prior one ($lastId_bin)." );
                        }
 
                        $lastId = $id;
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 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 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 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 8ba2aeb..b19376d 100644 (file)
@@ -16,9 +16,6 @@
  * 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.
index 11a25c4..7babcac 100644 (file)
@@ -35,8 +35,7 @@
                        <directory>structure</directory>
                        <file>suites/LessTestSuite.php</file>
                </testsuite>
-               <!-- As there is a class Maintenance, we cannot use the
-                    name "maintenance" directly -->
+               <!-- As there is a class Maintenance, we cannot use the name "maintenance" directly -->
                <testsuite name="maintenance_suite">
                        <directory>maintenance</directory>
                </testsuite>
index e48a116..7a33a22 100644 (file)
@@ -7,4 +7,3 @@ class CoreParserTestSuite extends PHPUnit_Framework_TestSuite {
        }
 
 }
-
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 f31a646..6468646 100644 (file)
@@ -32,7 +32,6 @@ return [
                        'mediawiki.page.ready',
                        'mediawiki.page.startup',
                        'test.sinonjs',
-                       'dom-level2-shim',
                ],
                'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
@@ -76,6 +75,7 @@ return [
                        'tests/qunit/suites/resources/mediawiki/mediawiki.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.inspect.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.track.test.js',
@@ -94,6 +94,7 @@ return [
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.test.js',
                        'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
                        'tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js',
+                       'tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js',
@@ -137,11 +138,12 @@ return [
                        'mediawiki.util',
                        'mediawiki.viewport',
                        'mediawiki.special.recentchanges',
-                       'mediawiki.rcfilters.filters',
+                       'mediawiki.rcfilters.filters.dm',
                        'mediawiki.language',
                        'mediawiki.cldr',
                        'mediawiki.cookie',
                        'mediawiki.experiments',
+                       'mediawiki.inspect',
                        'test.mediawiki.qunit.testrunner',
                ],
        ]
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 0b28684..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
@@ -26,6 +26,7 @@
        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.
                        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 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 9c7660f..4e77d72 100644 (file)
@@ -11,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' ),
@@ -44,9 +43,8 @@
                $toggle.trigger( 'click' );
        } );
 
-       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' ),
@@ -70,9 +68,8 @@
                $toggle.trigger( 'click' );
        } );
 
-       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' );
        }
 
-       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' );
        }
 
-       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' );
        } );
 
-       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' );
        } );
 
-       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' );
        } );
 
-       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' );
        } );
 
-       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
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 5203def..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' ]
                } );
        } );
 
-       // 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 483a37d..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">' +
                );
        } );
 
-       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 1676130..69ab797 100644 (file)
@@ -6,7 +6,7 @@
                }
        } ) );
 
-       QUnit.test( 'origin is included in GET requests', 1, function ( assert ) {
+       QUnit.test( 'origin is included in GET requests', function ( assert ) {
                var api = new mw.ForeignApi( '//localhost:4242/w/api.php' );
 
                this.server.respond( function ( request ) {
@@ -17,7 +17,7 @@
                return api.get( {} );
        } );
 
-       QUnit.test( 'origin is included in POST requests', 2, function ( assert ) {
+       QUnit.test( 'origin is included in POST requests', function ( assert ) {
                var api = new mw.ForeignApi( '//localhost:4242/w/api.php' );
 
                this.server.respond( function ( request ) {
index a79bff6..8ad1290 100644 (file)
@@ -6,7 +6,7 @@
                }
        } ) );
 
-       QUnit.test( '.getCategoriesByPrefix()', 1, function ( assert ) {
+       QUnit.test( '.getCategoriesByPrefix()', function ( assert ) {
                this.server.respondWith( [ 200, { 'Content-Type': 'application/json' },
                        '{ "query": { "allpages": [ ' +
                                '{ "title": "Category:Food" },' +
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 d8b5db8..7282b3f 100644 (file)
@@ -6,7 +6,7 @@
                }
        } ) );
 
-       QUnit.test( '.getMessages()', 1, function ( assert ) {
+       QUnit.test( '.getMessages()', function ( assert ) {
                this.server.respondWith( /ammessages=foo%7Cbaz/, [
                        200,
                        { 'Content-Type': 'application/json' },
index 7ed1875..854e4b1 100644 (file)
@@ -6,7 +6,7 @@
                }
        } ) );
 
-       QUnit.test( 'saveOption', 2, function ( assert ) {
+       QUnit.test( 'saveOption', function ( assert ) {
                var api = new mw.Api(),
                        stub = this.sandbox.stub( mw.Api.prototype, 'saveOptions' );
 
@@ -16,7 +16,7 @@
                assert.deepEqual( stub.getCall( 0 ).args, [ { foo: 'bar' } ], '#saveOptions called correctly' );
        } );
 
-       QUnit.test( 'saveOptions without Unit Separator', 13, function ( assert ) {
+       QUnit.test( 'saveOptions without Unit Separator', function ( assert ) {
                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
 
                // 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 );
                        }
                } );
 
@@ -74,7 +74,7 @@
                );
        } );
 
-       QUnit.test( 'saveOptions with Unit Separator', 14, function ( assert ) {
+       QUnit.test( 'saveOptions with Unit Separator', function ( assert ) {
                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
 
                // 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 );
                        }
                } );
 
index 7d27352..74da009 100644 (file)
@@ -39,7 +39,7 @@
                ] );
 
                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'  );
+                       assert.equal( html, '<p><b>Earth</b> is a planet.</p>', 'Parse page by Title object' );
                } );
        } );
 }( mediaWiki ) );
index 6a00ac9..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();
 
                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 b1bd12b..bfaf7f2 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( mw, $ ) {
        QUnit.module( 'mediawiki.api.upload', QUnit.newMwEnvironment( {} ) );
 
-       QUnit.test( 'Basic functionality', 2, function ( assert ) {
+       QUnit.test( 'Basic functionality', function ( assert ) {
                var api = new mw.Api();
                assert.ok( api.upload );
                assert.throws( function () {
@@ -9,7 +9,7 @@
                } );
        } );
 
-       QUnit.test( 'Set up iframe upload', 5, function ( assert ) {
+       QUnit.test( 'Set up iframe upload', function ( assert ) {
                var $iframe, $form, $input,
                        api = new mw.Api();
 
diff --git a/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js b/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js
new file mode 100644 (file)
index 0000000..25ea988
--- /dev/null
@@ -0,0 +1,179 @@
+( function ( mw ) {
+       QUnit.module( 'mediawiki.rcfilters - FilterItem' );
+
+       QUnit.test( 'Initializing filter item', function ( assert ) {
+               var item,
+                       group1 = new mw.rcfilters.dm.FilterGroup( 'group1' );
+
+               item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 );
+               assert.equal(
+                       item.getName(),
+                       'filter1',
+                       'Filter name is retained.'
+               );
+               assert.equal(
+                       item.getGroupName(),
+                       'group1',
+                       'Group name is retained.'
+               );
+
+               item = new mw.rcfilters.dm.FilterItem(
+                       'filter1',
+                       group1,
+                       {
+                               label: 'test label',
+                               description: 'test description'
+                       }
+               );
+               assert.equal(
+                       item.getLabel(),
+                       'test label',
+                       'Label information is retained.'
+               );
+               assert.equal(
+                       item.getLabel(),
+                       'test label',
+                       'Description information is retained.'
+               );
+
+               item = new mw.rcfilters.dm.FilterItem(
+                       'filter1',
+                       group1,
+                       {
+                               selected: true
+                       }
+               );
+               assert.equal(
+                       item.isSelected(),
+                       true,
+                       'Item can be selected in the config.'
+               );
+               item.toggleSelected( true );
+               assert.equal(
+                       item.isSelected(),
+                       true,
+                       'Item can toggle its selected state.'
+               );
+
+               // Subsets
+               item = new mw.rcfilters.dm.FilterItem(
+                       'filter1',
+                       group1,
+                       {
+                               subset: [ 'sub1', 'sub2', 'sub3' ]
+                       }
+               );
+               assert.deepEqual(
+                       item.getSubset(),
+                       [ 'sub1', 'sub2', 'sub3' ],
+                       'Subset information is retained.'
+               );
+               assert.equal(
+                       item.existsInSubset( 'sub1' ),
+                       true,
+                       'Specific item exists in subset.'
+               );
+               assert.equal(
+                       item.existsInSubset( 'sub10' ),
+                       false,
+                       'Specific item does not exists in subset.'
+               );
+               assert.equal(
+                       item.isIncluded(),
+                       false,
+                       'Initial state of "included" is false.'
+               );
+
+               item.toggleIncluded( true );
+               assert.equal(
+                       item.isIncluded(),
+                       true,
+                       'Item toggles its included state.'
+               );
+
+               // Conflicts
+               item = new mw.rcfilters.dm.FilterItem(
+                       'filter1',
+                       group1,
+                       {
+                               conflicts: [ 'conflict1', 'conflict2', 'conflict3' ]
+                       }
+               );
+               assert.deepEqual(
+                       item.getConflicts(),
+                       [ 'conflict1', 'conflict2', 'conflict3' ],
+                       'Conflict information is retained.'
+               );
+               assert.equal(
+                       // TODO: Consider allowing for either a FilterItem or a filter name
+                       // in this method, so it is consistent with the subset one
+                       item.existsInConflicts( new mw.rcfilters.dm.FilterItem( 'conflict1', group1 ) ),
+                       true,
+                       'Specific item exists in conflicts.'
+               );
+               assert.equal(
+                       item.existsInConflicts( new mw.rcfilters.dm.FilterItem( 'conflict10', group1 ) ),
+                       false,
+                       'Specific item does not exists in conflicts.'
+               );
+               assert.equal(
+                       item.isConflicted(),
+                       false,
+                       'Initial state of "conflicted" is false.'
+               );
+
+               item.toggleConflicted( true );
+               assert.equal(
+                       item.isConflicted(),
+                       true,
+                       'Item toggles its conflicted state.'
+               );
+
+               // Fully covered
+               item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 );
+               assert.equal(
+                       item.isFullyCovered(),
+                       false,
+                       'Initial state of "full coverage" is false.'
+               );
+               item.toggleFullyCovered( true );
+               assert.equal(
+                       item.isFullyCovered(),
+                       true,
+                       'Item toggles its fully coverage state.'
+               );
+
+       } );
+
+       QUnit.test( 'Emitting events', function ( assert ) {
+               var group1 = new mw.rcfilters.dm.FilterGroup( 'group1' ),
+                       item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 ),
+                       events = [];
+
+               // Listen to update events
+               item.on( 'update', function () {
+                       events.push( item.getState() );
+               } );
+
+               // Do stuff
+               item.toggleSelected( true ); // { selected: true, included: false, conflicted: false, fullyCovered: false }
+               item.toggleSelected( true ); // No event (duplicate state)
+               item.toggleIncluded( true ); // { selected: true, included: true, conflicted: false, fullyCovered: false }
+               item.toggleConflicted( true ); // { selected: true, included: true, conflicted: true, fullyCovered: false }
+               item.toggleFullyCovered( true ); // { selected: true, included: true, conflicted: true, fullyCovered: true }
+               item.toggleSelected(); // { selected: false, included: true, conflicted: true, fullyCovered: true }
+
+               // Check emitted events
+               assert.deepEqual(
+                       events,
+                       [
+                               { selected: true, included: false, conflicted: false, fullyCovered: false },
+                               { selected: true, included: true, conflicted: false, fullyCovered: false },
+                               { selected: true, included: true, conflicted: true, fullyCovered: false },
+                               { selected: true, included: true, conflicted: true, fullyCovered: true },
+                               { selected: false, included: true, conflicted: true, fullyCovered: true }
+                       ],
+                       'Events emitted successfully.'
+               );
+       } );
+}( mediaWiki ) );
index b2857d9..ad0ed54 100644 (file)
@@ -67,7 +67,7 @@
                );
 
                assert.deepEqual(
-                       model.getState(),
+                       model.getSelectedState(),
                        {
                                group1filter1: false,
                                group1filter2: false,
                        'Initial state of filters'
                );
 
-               model.updateFilters( {
+               model.toggleFiltersSelected( {
                        group1filter1: true,
                        group2filter2: true,
                        group3filter1: true
                } );
                assert.deepEqual(
-                       model.getState(),
+                       model.getSelectedState(),
                        {
                                group1filter1: true,
                                group1filter2: false,
                var matches,
                        definition = {
                                group1: {
-                                       title: 'Group 1',
+                                       title: 'Group 1 title',
                                        type: 'send_unselected_if_any',
                                        filters: [
                                                {
                                        ]
                                },
                                group2: {
-                                       title: 'Group 2',
+                                       title: 'Group 2 title',
                                        type: 'send_unselected_if_any',
                                        filters: [
                                                {
                                                },
                                                {
                                                        name: 'group2filter2',
-                                                       label: 'Group 2: Filter 2',
+                                                       label: 'xGroup 2: Filter 2',
                                                        description: 'Description of Filter 2 in Group 2'
                                                }
                                        ]
                                }
                        },
-                       model = new mw.rcfilters.dm.FiltersViewModel();
+                       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 );
 
-               matches = model.findMatches( 'group 1' );
-               assert.equal(
-                       matches.group1.length,
-                       2,
-                       'findMatches finds correct group with correct number of results'
-               );
-
-               assert.deepEqual(
-                       matches.group1.map( function ( item ) { return item.getName(); } ),
-                       [ 'group1filter1', 'group1filter2' ],
-                       'findMatches finds the correct items within a single group'
-               );
-
-               matches = model.findMatches( 'filter 1' );
-               assert.ok(
-                       matches.group1.length === 1 && matches.group2.length === 1,
-                       'findMatches finds correct number of results in multiple groups'
-               );
-
-               assert.deepEqual(
-                       [
-                               matches.group1.map( function ( item ) { return item.getName(); } ),
-                               matches.group2.map( function ( item ) { return item.getName(); } )
-                       ],
-                       [
-                               [ 'group1filter1' ],
-                               [ 'group2filter1' ]
-                       ],
-                       'findMatches finds the correct items within multiple groups'
-               );
+               testCases.forEach( function ( testCase ) {
+                       matches = model.findMatches( testCase.query );
+                       assert.deepEqual(
+                               extractNames( matches ),
+                               testCase.expectedMatches,
+                               testCase.reason
+                       );
+               } );
 
                matches = model.findMatches( 'foo' );
                assert.ok(
                                hidefilter4: 0,
                                hidefilter5: 0,
                                hidefilter6: 0,
-                               group3: 'all',
+                               group3: 'all'
                        },
                        'Unselected filters return all parameters falsey or \'all\'.'
                );
 
                // Select 1 filter
-               model.updateFilters( {
+               model.toggleFiltersSelected( {
                        hidefilter1: true,
                        hidefilter2: false,
                        hidefilter3: false,
                );
 
                // Select 2 filters
-               model.updateFilters( {
+               model.toggleFiltersSelected( {
                        hidefilter1: true,
                        hidefilter2: true,
                        hidefilter3: false,
                );
 
                // Select 3 filters
-               model.updateFilters( {
+               model.toggleFiltersSelected( {
                        hidefilter1: true,
                        hidefilter2: true,
                        hidefilter3: true,
                );
 
                // Select 1 filter from string_options
-               model.updateFilters( {
+               model.toggleFiltersSelected( {
                        filter7: true,
                        filter8: false,
                        filter9: false
                );
 
                // Select 2 filters from string_options
-               model.updateFilters( {
+               model.toggleFiltersSelected( {
                        filter7: true,
                        filter8: true,
                        filter9: false
                );
 
                // Select 3 filters from string_options
-               model.updateFilters( {
+               model.toggleFiltersSelected( {
                        filter7: true,
                        filter8: true,
                        filter9: true
                                                {
                                                        name: 'hidefilter1',
                                                        label: 'Show filter 1',
-                                                       description: 'Description of Filter 1 in Group 1'
+                                                       description: 'Description of Filter 1 in Group 1',
+                                                       default: true
                                                },
                                                {
                                                        name: 'hidefilter2',
                                                {
                                                        name: 'hidefilter3',
                                                        label: 'Show filter 3',
-                                                       description: 'Description of Filter 3 in Group 1'
+                                                       description: 'Description of Filter 3 in Group 1',
+                                                       default: true
                                                }
                                        ]
                                },
                                                {
                                                        name: 'hidefilter5',
                                                        label: 'Show filter 5',
-                                                       description: 'Description of Filter 2 in Group 2'
+                                                       description: 'Description of Filter 2 in Group 2',
+                                                       default: true
                                                },
                                                {
                                                        name: 'hidefilter6',
                                                {
                                                        name: 'filter8',
                                                        label: 'Group 3: Filter 2',
-                                                       description: 'Description of Filter 2 in Group 3'
+                                                       description: 'Description of Filter 2 in Group 3',
+                                                       default: true
                                                },
                                                {
                                                        name: 'filter9',
                                        ]
                                }
                        },
+                       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 = empty filter definition
+               // Empty query = only default values
                assert.deepEqual(
                        model.getFiltersFromParameters( {} ),
-                       {
-                               hidefilter1: false, // The text is "show filter 1"
-                               hidefilter2: false, // The text is "show filter 2"
-                               hidefilter3: false, // The text is "show filter 3"
-                               hidefilter4: false, // The text is "show filter 4"
-                               hidefilter5: false, // The text is "show filter 5"
-                               hidefilter6: false, // The text is "show filter 6"
-                               filter7: false,
-                               filter8: false,
-                               filter9: false
-                       },
-                       'Empty parameter query results in filters in initial state'
+                       defaultFilterRepresentation,
+                       'Empty parameter query results in filters in initial default state'
                );
 
                assert.deepEqual(
                        model.getFiltersFromParameters( {
-                               hidefilter1: '1'
-                       } ),
-                       {
-                               hidefilter1: false, // The text is "show filter 1"
-                               hidefilter2: true, // The text is "show filter 2"
-                               hidefilter3: true, // The text is "show filter 3"
-                               hidefilter4: false, // The text is "show filter 4"
-                               hidefilter5: false, // The text is "show filter 5"
-                               hidefilter6: false, // The text is "show filter 6"
-                               filter7: false,
-                               filter8: false,
-                               filter9: false
-                       },
-                       'One falsey parameter in a group makes the rest of the filters in the group truthy (checked) in the interface'
-               );
-
-               assert.deepEqual(
-                       model.getFiltersFromParameters( {
-                               hidefilter1: '1',
                                hidefilter2: '1'
                        } ),
-                       {
+                       $.extend( {}, defaultFilterRepresentation, {
                                hidefilter1: false, // The text is "show filter 1"
                                hidefilter2: false, // The text is "show filter 2"
-                               hidefilter3: true, // The text is "show filter 3"
-                               hidefilter4: false, // The text is "show filter 4"
-                               hidefilter5: false, // The text is "show filter 5"
-                               hidefilter6: false, // The text is "show filter 6"
-                               filter7: false,
-                               filter8: false,
-                               filter9: false
-                       },
-                       'Two falsey parameters in a \'send_unselected_if_any\' group makes the rest of the filters in the group truthy (checked) in the interface'
+                               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(
                                hidefilter2: '1',
                                hidefilter3: '1'
                        } ),
-                       {
-                               // TODO: This will have to be represented as a different state, though.
+                       $.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"
-                               hidefilter4: false, // The text is "show filter 4"
-                               hidefilter5: false, // The text is "show filter 5"
-                               hidefilter6: false, // The text is "show filter 6"
-                               filter7: false,
-                               filter8: false,
-                               filter9: false
-                       },
+                               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.
-
-               model.updateFilters(
+               // 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 toggleFiltersSelected() below collide.
+               // The result of the first is overridden by the result of the second,
+               // since both get a full state object from getFiltersFromParameters that **only** relates
+               // to the input it receives.
+               model.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
                                hidefilter1: '1'
                        } )
                );
 
-               model.updateFilters(
+               model.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
-                               hidefilter3: '1'
+                               hidefilter6: '1'
                        } )
                );
 
-               // 1 and 3 are separately unchecked via hide parameters, 2 should still be
-               // checked.
-               // This can simulate separate filters in the same group being hidden different
-               // ways (e.g. preferences and URL).
+               // The result here is ignoring the first toggleFiltersSelected call
+               // We should receive default values + hidefilter6 as false
                assert.deepEqual(
-                       model.getState(),
-                       {
-                               hidefilter1: false, // The text is "show filter 1"
-                               hidefilter2: true, // The text is "show filter 2"
-                               hidefilter3: false, // The text is "show filter 3"
-                               hidefilter4: false, // The text is "show filter 4"
-                               hidefilter5: false, // The text is "show filter 5"
-                               hidefilter6: false, // The text is "show filter 6"
-                               filter7: false,
-                               filter8: false,
-                               filter9: false
-                       },
-                       'After unchecking 2 of 3 \'send_unselected_if_any\' filters via separate updateFilters calls, only the remaining one is still checked.'
+                       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.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
-                               hidefilter1: '1'
+                               hidefilter1: '0'
                        } )
                );
-               model.updateFilters(
+               model.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
-                               hidefilter1: '0'
+                               hidefilter1: '1'
                        } )
                );
 
                // Simulates minor edits being hidden in preferences, then unhidden via URL
                // override.
                assert.deepEqual(
-                       model.getState(),
-                       {
-                               hidefilter1: false, // The text is "show filter 1"
-                               hidefilter2: false, // The text is "show filter 2"
-                               hidefilter3: false, // The text is "show filter 3"
-                               hidefilter4: false, // The text is "show filter 4"
-                               hidefilter5: false, // The text is "show filter 5"
-                               hidefilter6: false, // The text is "show filter 6"
-                               filter7: false,
-                               filter8: false,
-                               filter9: false
-                       },
-                       'After unchecking then checking a \'send_unselected_if_any\' filter (without touching other filters in that group), all are checked'
+                       model.getSelectedState(),
+                       defaultFilterRepresentation,
+                       'After checking and then unchecking a \'send_unselected_if_any\' filter (without touching other filters in that group), results are default'
                );
 
-               model.updateFilters(
+               model.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
                                group3: 'filter7'
                        } )
                );
                assert.deepEqual(
-                       model.getState(),
-                       {
-                               hidefilter1: false, // The text is "show filter 1"
-                               hidefilter2: false, // The text is "show filter 2"
-                               hidefilter3: false, // The text is "show filter 3"
-                               hidefilter4: false, // The text is "show filter 4"
-                               hidefilter5: false, // The text is "show filter 5"
-                               hidefilter6: false, // The text is "show filter 6"
+                       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.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
                                group3: 'filter7,filter8'
                        } )
                );
                assert.deepEqual(
-                       model.getState(),
-                       {
-                               hidefilter1: false, // The text is "show filter 1"
-                               hidefilter2: false, // The text is "show filter 2"
-                               hidefilter3: false, // The text is "show filter 3"
-                               hidefilter4: false, // The text is "show filter 4"
-                               hidefilter5: false, // The text is "show filter 5"
-                               hidefilter6: false, // The text is "show filter 6"
+                       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.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
                                group3: 'filter7,filter8,filter9'
                        } )
                );
                assert.deepEqual(
-                       model.getState(),
-                       {
-                               hidefilter1: false, // The text is "show filter 1"
-                               hidefilter2: false, // The text is "show filter 2"
-                               hidefilter3: false, // The text is "show filter 3"
-                               hidefilter4: false, // The text is "show filter 4"
-                               hidefilter5: false, // The text is "show filter 5"
-                               hidefilter6: false, // The text is "show filter 6"
+                       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.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
-                               group3: 'filter7,filter8,filter9'
+                               group3: 'filter7,all,filter9'
                        } )
                );
                assert.deepEqual(
-                       model.getState(),
-                       {
-                               hidefilter1: false, // The text is "show filter 1"
-                               hidefilter2: false, // The text is "show filter 2"
-                               hidefilter3: false, // The text is "show filter 3"
-                               hidefilter4: false, // The text is "show filter 4"
-                               hidefilter5: false, // The text is "show filter 5"
-                               hidefilter6: false, // The text is "show filter 6"
+                       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.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
                                group3: 'filter7,foo,filter9'
                        } )
                );
                assert.deepEqual(
-                       model.getState(),
-                       {
-                               hidefilter1: false, // The text is "show filter 1"
-                               hidefilter2: false, // The text is "show filter 2"
-                               hidefilter3: false, // The text is "show filter 3"
-                               hidefilter4: false, // The text is "show filter 4"
-                               hidefilter5: false, // The text is "show filter 5"
-                               hidefilter6: false, // The text is "show filter 6"
+                       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.'
                );
        } );
                        '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.toggleFiltersSelected( {
+                       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.toggleFiltersSelected( {
+                       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.toggleFiltersSelected( {
+                       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.toggleFiltersSelected( {
+                       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.toggleFiltersSelected( {
+                       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.toggleFiltersSelected( {
+                       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.toggleFiltersSelected( {
+                       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.toggleFiltersSelected( {
+                       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.toggleFiltersSelected( {
+                       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.toggleFiltersSelected( {
+                       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.toggleFiltersSelected( {
+                       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.toggleFiltersSelected( {
+                       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 124c49f..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', 5, function ( assert ) {
+       QUnit.test( 'Case-sensivity', function ( assert ) {
                var title;
 
                // Default config
                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' );
 
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.inspect.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.inspect.test.js
new file mode 100644 (file)
index 0000000..1f7a5ec
--- /dev/null
@@ -0,0 +1,74 @@
+( function ( mw ) {
+
+       QUnit.module( 'mediawiki.inspect' );
+
+       QUnit.test( '.getModuleSize() - scripts', function ( assert ) {
+               mw.loader.implement(
+                       'test.inspect.script',
+                       function () { 'example'; }
+               );
+
+               return mw.loader.using( 'test.inspect.script' ).then( function () {
+                       assert.equal(
+                               mw.inspect.getModuleSize( 'test.inspect.script' ),
+                               // name, script function
+                               43,
+                               'test.inspect.script'
+                       );
+               } );
+       } );
+
+       QUnit.test( '.getModuleSize() - scripts, styles', function ( assert ) {
+               mw.loader.implement(
+                       'test.inspect.both',
+                       function () { 'example'; },
+                       { css: [ '.example {}' ] }
+               );
+
+               return mw.loader.using( 'test.inspect.both' ).then( function () {
+                       assert.equal(
+                               mw.inspect.getModuleSize( 'test.inspect.both' ),
+                               // name, script function, styles object
+                               64,
+                               'test.inspect.both'
+                       );
+               } );
+       } );
+
+       QUnit.test( '.getModuleSize() - scripts, messages', function ( assert ) {
+               mw.loader.implement(
+                       'test.inspect.scriptmsg',
+                       function () { 'example'; },
+                       {},
+                       { example: 'Hello world.' }
+               );
+
+               return mw.loader.using( 'test.inspect.scriptmsg' ).then( function () {
+                       assert.equal(
+                               mw.inspect.getModuleSize( 'test.inspect.scriptmsg' ),
+                               // name, script function, empty styles object, messages object
+                               74,
+                               'test.inspect.scriptmsg'
+                       );
+               } );
+       } );
+
+       QUnit.test( '.getModuleSize() - scripts, styles, messages, templates', function ( assert ) {
+               mw.loader.implement(
+                       'test.inspect.all',
+                       function () { 'example'; },
+                       { css: [ '.example {}' ] },
+                       { example: 'Hello world.' },
+                       { 'example.html': '<p>Hello world.<p>' }
+               );
+
+               return mw.loader.using( 'test.inspect.all' ).then( function () {
+                       assert.equal(
+                               mw.inspect.getModuleSize( 'test.inspect.all' ),
+                               // name, script function, styles object, messages object, templates object
+                               126,
+                               'test.inspect.all'
+                       );
+               } );
+       } );
+}( mediaWiki ) );
index f848f3e..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 ) {
                                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( {
                }
        ];
 
-       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 ) {
                                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 2171f34..b965079 100644 (file)
@@ -1,6 +1,8 @@
 ( function ( mw, $ ) {
        'use strict';
 
+       var grammarTests;
+
        QUnit.module( 'mediawiki.language', QUnit.newMwEnvironment( {
                setup: function () {
                        this.liveLangData = mw.language.data;
@@ -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', 2, function ( assert ) {
+       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,
@@ -70,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 92ee7dd..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 () {
                ).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 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..119222a 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;
 
                assert.strictEqual( conf.set( arry, 'Arry' ), false, 'Map.set returns boolean false if key was invalid (Array)' );
                assert.strictEqual( conf.set( nummy, 'Nummy' ), false, 'Map.set returns boolean false if key was invalid (Number)' );
 
-               assert.strictEqual( conf.get( funky ), null, 'Map.get ruturns null if selection was invalid (Function)' );
-               assert.strictEqual( conf.get( nummy ), null, 'Map.get ruturns null if selection was invalid (Number)' );
-
                conf.set( String( nummy ), 'I used to be a number' );
 
+               assert.strictEqual( conf.get( funky ), null, 'Map.get returns null if selection was invalid (Function)' );
+               assert.strictEqual( conf.get( nummy ), null, 'Map.get returns null if selection was invalid (Number)' );
+               assert.propEqual( conf.get( [ nummy ] ), {}, 'Map.get returns null if selection was invalid (multiple)' );
+               assert.strictEqual( conf.get( nummy, false ), false, 'Map.get returns custom fallback for invalid selection' );
+
                assert.strictEqual( conf.exists( 'doesNotExist' ), false, 'Map.exists where property does not exist' );
                assert.strictEqual( conf.exists( 'undef' ), true, 'Map.exists where value is `undefined`' );
-               assert.strictEqual( conf.exists( nummy ), false, 'Map.exists where key is invalid but looks like an existing key' );
+               assert.strictEqual( conf.exists( [ 'undef', 'example' ] ), true, 'Map.exists with multiple keys (all existing)' );
+               assert.strictEqual( conf.exists( [ 'example', 'doesNotExist' ] ), false, 'Map.exists with multiple keys (some non-existing)' );
+               assert.strictEqual( conf.exists( [] ), true, 'Map.exists with no keys' );
+               assert.strictEqual( conf.exists( nummy ), false, 'Map.exists with invalid key that looks like an existing key' );
+               assert.strictEqual( conf.exists( [ nummy ] ), false, 'Map.exists with invalid key that looks like an existing key' );
 
                // Multiple values at once
+               conf = new mw.Map();
                someValues = {
                        foo: 'bar',
                        lorem: 'ipsum',
                        notExist: null
                }, 'Map.get return includes keys that were not found as null values' );
 
-               // Interacting with globals and accessing the values object
-               this.suppressWarnings();
-               assert.strictEqual( conf.get(), conf.values, 'Map.get returns the entire values object by reference (if called without arguments)' );
-               this.restoreWarnings();
+               assert.propEqual( conf.values, someValues, 'Map.values is an internal object with all values (exposed for convenience)' );
+               assert.propEqual( conf.get(), someValues, 'Map.get() returns an object with all values' );
 
+               // Interacting with globals
                conf.set( 'globalMapChecker', 'Hi' );
 
                assert.ok( ( 'globalMapChecker' in window ) === false, 'Map does not its store values in the window object by default' );
 
        } );
 
-       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 7f6efa0..bc12642 100644 (file)
 
                result2 = mw.user.generateRandomSessionId();
                assert.notEqual( result, result2, 'different when called multiple times' );
+       } );
 
+       QUnit.test( 'sessionId', function ( assert ) {
+               var result = mw.user.sessionId(),
+                       result2 = mw.user.sessionId();
+               assert.equal( typeof result, 'string', 'type' );
+               assert.equal( $.trim( result ), result, 'no leading or trailing whitespace' );
+               assert.equal( result2, result, 'retained' );
        } );
 }( mediaWiki, jQuery ) );
index 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 e6e798b..02ca243 100644 (file)
@@ -1,4 +1,4 @@
-/*global isCompatible: true */
+/* global isCompatible: true */
 ( function ( $ ) {
        var testcases = {
                tested: [
 
        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 c38b89c..de201b9 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -272,7 +272,7 @@ function wfStreamThumb( array $params ) {
        // For 404 handled thumbnails, we only use the base name of the URI
        // for the thumb params and the parent directory for the source file name.
        // Check that the zone relative path matches up so squid caches won't pick
-       // up thumbs that would not be purged on source file deletion (bug 34231).
+       // up thumbs that would not be purged on source file deletion (T36231).
        if ( $rel404 !== null ) { // thumbnail was handled via 404
                if ( rawurldecode( $rel404 ) === $img->getThumbRel( $thumbName ) ) {
                        // Request for the canonical thumbnail name
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';